1. 程式人生 > >Java Annotation(2)

Java Annotation(2)

使用Annotation的例子


學習《瘋狂java講義》

使用標記Annotation

  • 首先,我們先定義一個不含任何成員變數的Annotation類,也就是標記Annotation。
//Retention註釋用於指定Testable註釋可以保留多久,這裡是保留在執行期間
//Target註釋用於指定Testable註釋能修飾的目標,這裡指定了只能是方法
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
//定義Annotation用@interface關鍵字。
//我們還記得定義介面的時候用的是interface關鍵字
public @interface Testable{}
  • 然後我們再定義一個類,裡面定義一些方法,有的用了Testable註釋,有的沒有用
public class MyTest {
    @Testable
    public static void m1(){}
    public static void m2(){}
    @Testable
    public static void m3(){
        throw new RuntimeException("Boom");
    }
    public static void m4(){
} @Testable public static void m5(){} public static void m6(){} @Testable public static void m7(){ throw new RuntimeException("Crash"); } public static void m8(){} }
  • 有了這些註釋,並不能真正的影響程式的執行。因此我們還需要為這些註釋提供一個註釋處理工具。它會分析目標類,如果目標類方法使用了@Testable註釋,則通過反射來執行該測試方法。
public class TestProcessor{
    public static void process(String clazz) throws ClassNotFoundException {
        int passed = 0;
        int failed = 0;
        for(Method m : Class.forName(clazz).getMethods()){
            if (m.isAnnotationPresent(Testable.class)){
                try{
		    m.invoke(null);
		    passed++;
		} catch (Exception ex){
		    System.out.printf("方法"+m+"異常"+ex.getCause()+"\n");
                    failed++;
		}
            }
        }
	System.out.println("共運行了"+(passed+failed)+"方法,"+"成功了"+passed+",失敗了"+failed);
    }
}
  • 定義了註釋,有了目標類,又定義了註釋工具類,現在可以再加個主方法,然後把上面的都執行起來啦
public class RunTest {
    public static void main(String[] args)throws Exception{
        TestProcessor.process("MyTest");
    }
}
  • Ok,現在看看執行的結果