Annotation 注釋,這個注釋和寫代碼時解釋代碼在幹什麼那個注釋完全不是一個東西,這裡的注釋是指代碼中的特殊標記,這些標記可以在編譯,類載入,運行時被讀取,並執行相應的處理。 通過這些標記,可以在不改變原有邏輯的情況下,在源檔案嵌入一些補充的資訊。Annotation可用於修飾包,類,構造器, 方法,成員變數,參數,局部變數的聲明。
其實Java中的Annotation和C#中的attribute是同一個東西,都是用來設定中繼資料用的,它們的區別只有少許幾個地方
下面這個文章講的很好
http://rednaxelafx.iteye.com/blog/464889
Java中有3種內建的annotation,@Override(限定重寫父類方法)、@Deprecated(標示已淘汰)、@SuppressWarningsAnnotation(抑制編譯器警告)
自訂的annotation如以下格式,需要使用@interface關鍵字,要使用annotation需引用java.lang包
下面看一個使用annotation的例子
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)//定義一個標記注釋,不包含任何成員變數,即不可傳入中繼資料public @interface Testable {}
public class MyTest{//使用@Testable標記注釋指定該方法是可測試的@Testablepublic static void m1() {}public static void m2() {} //使用@Testable標記注釋指定該方法是可測試的@Testablepublic static void m3() { throw new RuntimeException("Boom"); }public static void m4(){} //使用@Testable標記注釋指定該方法是可測試的@Testablepublic static void m5(){} public static void m6(){}//使用@Testable標記注釋指定該方法是可測試的@Testablepublic static void m7(){ throw new RuntimeException("Crash"); } public static void m8(){}}
import java.lang.reflect.*;public class TestProcessor{public static void process(String clazz)throws ClassNotFoundException{int passed = 0;int failed = 0;//遍曆obj對象的所有方法for (Method m : Class.forName(clazz).getMethods()) {//如果包含@Testable標記注釋if (m.isAnnotationPresent(Testable.class)){try {//調用m方法m.invoke(null);//passed加1passed++;}catch (Exception ex){System.out.printf("方法" + m + "運行失敗,異常:" + ex.getCause() + "\n");failed++; }}}//統計測試結果System.out.printf("共運行了:" + (passed + failed)+ "個方法,其中:\n" + "失敗了:" + failed + "個,\n" + "成功了:" + passed + "個。\n"); }}主程式類
import java.lang.reflect.*; public class RunTests{public static void main(String[] args) throws Exception {//處理MyTest類TestProcessor.process("MyTest");}}
其中m3和m7兩個方法自己拋出異常,剩下兩個空方法執行成功