| 首先了解一下什么是注解: 所謂的注解就是當(dāng)我們編寫代碼時,常常見到的@Override、@Deprecated、@SuppressWarnings等,可以查看幫助文檔中:java.lang.annotation接口,所有的注解都必須實現(xiàn)該接口。 接下來了解一下注解的作用: 1、 當(dāng)我們在編寫代碼時用到一些不建議使用的方法時,就會出現(xiàn)一些黃色的警告,那么這些警告是怎么產(chǎn)生的呢,這就是注解的作用。下面我們通過一個實際的例子來分析一下其情況和過程。 還是先進(jìn)行了解一下@Deprecated這個注解: @Documented @Retention(value=RUNTIME) public @interface Deprecated用 @Deprecated 注釋的程序元素,不鼓勵程序員使用這樣的元素,通常是因為它很危險或存在更好的選擇。在使用不被贊成的程序元素或在不被贊成的代碼中執(zhí)行重寫時,編譯器會發(fā)出警告。 知道了這個注解的作用,那么我們就看一下java.util.Date這個包下的一些方法: @Deprecated public int getSeconds() { return normalize().getSeconds(); } 當(dāng)注解用在這個方法上時,編譯器就知道這個方法是個不建議被使用的方法,當(dāng)然如果我們用了,那么如果出現(xiàn)意外后果,也只有我們自己承擔(dān)了。那么我們在編寫代碼時,如果用到該方法,編譯器就會提醒我們不建議我們使用。 2、 了解一下@Override這個注解 表示一個方法聲明打算重寫超類中的另一個方法聲明。如果方法利用此注釋類型進(jìn)行注解但沒有重寫超類方法,則編譯器會生成一條錯誤消息。 當(dāng)我們繼承父類的某一個方法時,可以在方法的上面添加這個注解,如果不加,也不會有什么影響,但是如果我們加了,但是我們寫的方法父類中不存在該方法,則當(dāng)我們編譯的時候,就會報錯。 ………… 還有其他的注解作用自己看java幫助文檔 
 接下來,就學(xué)習(xí)一下如果寫自己的注解 注解有兩個常用的特征: 1、 注解的生命長度:即這個注解用到什么時候會被編譯器拋棄,總共有三個選項,一個注解只能為下列的一種情況。 a) SOURCE:編譯器要丟棄的注釋。 b) CLASS:編譯器將把注釋記錄在類文件中,但在運(yùn)行時 VM 不需要保留注釋。 c) RUNTIME:編譯器將把注釋記錄在類文件中,在運(yùn)行時 VM 將保留注釋,因此可以反射性地讀取。 2、 注解的使用范圍:即注解是在方法上還是類上、抑或是變量上,這類注解的取值可以為多個: a) ANNOTATION_TYPE:注解類型聲明 b) CONSTRUCTOR:構(gòu)造方法聲明 c) FIELD:字段聲明(包括枚舉常量) d) LOCAL_VARIABLE:局部變量聲明 e) METHOD:方法聲明 f) PACKAGE:包聲明 g) PARAMETER:參數(shù)聲明 h) TYPE:類、接口(包括注釋類型)或者枚舉聲明 那么根據(jù)這些情況我們就可以寫一些自己的注解:這個示例是圣思園編程競賽中的一道題 packagedong.application.shengsiyuan; importjava.lang.annotation.ElementType; importjava.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; importjava.lang.annotation.Target; //這個注解是用于標(biāo)示要進(jìn)行測試的方法 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public@interface Test { } 下面我們使用一下這個注解: packagedong.application.shengsiyuan; publicclass MyClass { public void method1() { System.out.println("method1"); } @Test public void method2() { System.out.println("method2"); } @Test public int add(int a, int b) { return a + b; } @Test public void doSomething(String str) { System.out.println(str); } @Test public void doSomething2() { System.out.println("doSomething2"); } @Test protected void doSomething3() { System.out.println("doSomething3"); } @Test private void doSomething4() { System.out.println("doSomething4"); } @Test void doSomething5() { System.out.println("doSomething5"); } } 下面我們通過反射來獲取注解信息,然后根據(jù)注解內(nèi)容進(jìn)行相應(yīng)的操作: packagedong.application.shengsiyuan; importjava.lang.reflect.Method; /** * 一個小型框架,用于執(zhí)行用戶的@Test注解的方法 * * @author HS * */ publicclass ApplicationRun { /** * 執(zhí)行用戶@Test注解的方法 *@param className * 要執(zhí)行的類 *@throws Exception */ public void run(String className) throwsException { // 獲取類的Class對象 Class<?> clazz =Class.forName(className); // 獲取類中的所有public方法 Method[] methods =clazz.getMethods(); for (Method method : methods) { // 獲取每一個方法的@Test注解 Test test =method.getAnnotation(Test.class); // 如果獲取的注解不為空則,進(jìn)行返回值類型判斷 if (test != null) { // 如果返回值類型為void,則進(jìn)行參數(shù)個數(shù)判斷 if(method.getReturnType() == void.class) { // 如果參數(shù)個數(shù)為0,則執(zhí)行該方法 if(method.getParameterTypes().length == 0) { method.invoke(clazz.newInstance(),new Object[]{}); } } } } } } 測試類: packagedong.application.shengsiyuan; 
 publicclass TestMyClass { public static void main(String[] args) { ApplicationRun app = newApplicationRun(); try { app.run("dong.application.shengsiyuan.MyClass"); } catch (Exception e) { e.printStackTrace(); } } } ====================================================================== 這個就是傳說中的測試框架的簡易模型,注解在以后的框架學(xué)習(xí)中作用很大,當(dāng)然如果我們僅僅是框架的使用者、一個機(jī)器人,那么沒有必要學(xué)習(xí)框架,只需要按照框架的條條框框去編代碼即可。 下面通過反射去獲取注解的內(nèi)容信息: 注解的定義: packagedong.application.annotation; importjava.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public@interface FirstAnnotation { //為注解的參數(shù)設(shè)置默認(rèn)值的方法就是在后面加上一個default //當(dāng)然也可以為數(shù)組,其類型也可以根據(jù)情況設(shè)定 String value() default "lovexiaojing";//李曉靜是我的女朋友哦。。。嘻嘻 } 注解的使用: packagedong.application.annotation; @FirstAnnotation("xiaojing") publicclass BaseAnnotationTest { @FirstAnnotation("xiaojing") public String toString() { return "LOVE XIAOJING"; } @FirstAnnotation public String action() { return "FOREVER"; } } 通過反射去獲取注解信息: packagedong.application.annotation; importjava.lang.annotation.Annotation; publicclass TestMyAnnotation { @SuppressWarnings("unchecked") public static void main(String[] args) { BaseAnnotationTest bat = newBaseAnnotationTest(); Class<?> clazz =bat.getClass(); FirstAnnotation f =clazz.getAnnotation(FirstAnnotation.class); System.out.println(f.annotationType().isAnnotation()); System.out.println(f.value()); // Annotation[] annotation =clazz.getAnnotations(); // for(Annotation a : annotation) // { // System.out.println(a.annotationType()); // Class<FirstAnnotation>ano = (Class<FirstAnnotation>) a.annotationType(); // System.out.println(ano.getName()); // } } } | 
|  |