JAVA註解引發的思考,JAVA註解引發思考
自從JDK5開始Java開始增加了對中繼資料(MetaData)的支援,也就是註解(Annotation),到JDK7時已經有四種基本註解,新增加了一種@SafeVarargs。
@Override註解標註一個子類重寫了父類的某個方法,如果父類中沒有這個方法,編譯器會報錯;
@Deprecated註解作用於方法、類、介面,表名此內容已經過去,是不是不推薦使用?但是標註過也是可以使用的;
@SupressWarnings註解用來抑制編譯器的警告資訊,例如使用集合時如果不指定泛型將有警告資訊;
@SafeVarargs該註解是在JDK7出現的,表示“堆汙染”警告;
“堆汙染”即是將一個不帶泛型的變數賦值給一個帶泛型的變數,將導致泛型變數汙染,如果不加上面註解,編譯器將給於提示,避免運行時異常。
我們通過一個簡單的例子說一下怎麼自訂註解,在自訂註解前需要瞭解一下元註解:給註解添加註解。
我們來實現一個測試類別的例子,在一個類裡面指定哪些方法可以被測試,在JUNIT中 方法以test開頭的才可以被測試它的這一機制也是通過註解來實現。
設計思路;
1.設計註解類
2.解析註解類的工具類
3.使用註解的類
TestAnnotation註解類
//ElementType、RetentionPolicy都是是枚舉類,即如果某類的一個成員變數為幾個固定值,可以使用枚舉//註解儲存到運行時,可以通過反射來讀取註解@Retention(RetentionPolicy.RUNTIME)//只可以應用到方法上面。@Target(ElementType.METHOD)public @interface TestAnnotation {String name() default "lilongsheng";int age() default 25;} 在上面程式中,註解的屬性值是儲存在了枚舉類裡面,這我們可以想到,自己定義註解時也把屬性儲存早枚舉裡面,如果這樣設計可以讓一個方法實現很多功能,例如增刪改查只需要更具枚舉值得類型來判斷。
/** * @description process the annotation * @param clazz * @throws ClassNotFoundException * @throws InstantiationException * @throws IllegalAccessException */public static void process(String clazz)throws ClassNotFoundException, InstantiationException, IllegalAccessException{Object o = Class.forName(clazz).newInstance();//遍曆clazz對應類裡面的所有方法for(Method m: Class.forName(clazz).getMethods()){//如果該方法是否使用了@TestAnnotation修飾if (m.isAnnotationPresent(TestAnnotation.class)) {try {//執行標有註解的方法m.invoke(o);} catch (Exception e) {e.printStackTrace();System.out.println("方法"+m+"運行失敗"+e.getCause());}}}}
測試類別
public class MyClass {@TestAnnotationpublic void method1(){System.out.println("測試方法1");}@TestAnnotationpublic void method2(){System.out.println("測試方法2");}public void method3(){System.out.println("測試方法3");}public void method4(){System.out.println("測試方法4");}}
執行結果:
只有添加註釋的方法被執行了,這就是自己定義注釋來實現控制哪些方法可以被測試,哪些不被測試,註解有一個明顯好處是解耦,註解賦予了程式特定功能,例如Hibernate中產生xml檔案、事務控制等都是通過註解實現。
但是Hibernate中xml檔案產生註解不是利用反射產生,是利用APT工具類實現,需要將註解的RetentionPloliy設定為Source。
在我們熟悉的架構中spring、struts、Hibernate、springmvc、ejb等等中都引入了註解塊,越來越多的架構都引入了註解,相比一大堆的設定檔而言的確簡介了很多,spring中aop、ioc等機制值得我們去深入研究。
這幾天仔細看看JDK包裡面的類,它裡面很多東西值得我們認真學習,看的時候越看你就會覺的裡面東西越多,上面用到了Method類、Class類,這兩個類經常用到也很有用,class類中forName()、newInstance()兩個方法是經常用的,Method類可以獲得到一個類中的所有方法,這其中包括它從Object根類繼承過來的方法,如getClass、hascode()等,通過看Object類發現getClass()方法用final修飾表名該方法不可以被子類重寫,這個方法可以得到一個對象的數所類,然後得到類載入類、類路徑都可以通過這種方式得到。
每個類執行個體化之後會產生一個Class對象,getClass方法正是得到這個Class對象的方法,還有一個更簡單的直接(對象.class)即可擷取,但是如果我們只知道一個字串呢,如“person”,這就需要使用forName()這個反射方法來獲得了。
拿到對象的Class對象後,就可以擷取該類的所有資訊,例如是否是介面、class、註解、方法等,以及得到所有欄位、方法、註解等,也可以動態來執行方法。
順便也看了看JDK7中的泛型,在JDK7中泛型文法和JDK6以前的有一些區別,變的更為簡潔了一些,例如在JDK6與JDK7對比
//JDK6.0List<String> list=new ArrayList<String>();//JDK7.0List<String> list=new ArrayList<>();
JDK7的文法變的簡潔了,在構造器中不用指明類型也可以,還有很多泛型提高java效能的使用,同時也在看高效平台中的底層泛型、方法、介面封裝。
java 註解重要
註解的目的,是為了說明某個方法的功能,做大型項目的時候特別重要。因為有時候,不是一個人在寫這個項目。沒註解讓人怎麼看懂呢?
java中注釋與註解於什不同?
首先來說注釋有三種:// /* */ /** */ 前兩種編譯器直接跳過,從來不閱讀,第三種編譯器是可以看懂的,當你使用javadoc這樣的命令時會用到,用來產生API時用的。
註解:這東東完全就是給編譯器看的。 比如@Ovrride表示這個方法是重寫了父類中的方法,而不是自訂的,所以這個時候編譯器會去檢查你的方法名是否和父類一樣,是否寫錯了。
起初,註解是比較簡單的,後來註解裡面可以加入變數和參數,以節省代碼(這些代碼都是大家共同認可的,用一個公式給代替了)
註解是對電腦的說明,也可以不用註解,自己寫代碼告訴電腦編譯器。 註解其實就是代碼,只是看起來和我們自己寫的有點不一樣而已。也是代碼的一部分,學習Hibernate和Spring等的時候會大量用到註解,用來節省大量代碼。