Java中的Annotation(2)----Annotation工作原理
上一篇文章已經介紹了如何使用JDK的三個標準Annotation,本文將介紹Annotation的原理,以及如何自定義Annotation,并利用Annotation來完成一些實際的功能。
定義Annotation
定義新的Annotation類型使用@interface關鍵字,這從一定意義上說明Annotation和接口的定義是有相似之處的。如下代碼定義了一個Annotation
//使用DK的元數據Annotation:Retention@Retention(RetentionPolicy.RUNTIME)//使用JDK的元數據Annotation:Target@Target(ElementType.METHOD)//定義一個標記注釋,不包含任何成員變量,即不可傳入元數據 public @interface Testable{}
使用Annotation
定義了Annotation之后就可以在程序的任何地方使用該Annotation,對于Annotation的使用和public、final這樣的修飾符很像,通常可以修飾類、方法、變量、接口等定義(默認情況下,Annotation用于修飾任何程序元素)。如下代碼,就是使用了上面的Annotation修飾方法。
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(){} }
提取Annotation
一個類或者一個方法使用Annotation修飾之后需要通過反射來提取Annotation的信息。需要注意當一個Annotation類型被定義為運行時Annotation后該注釋才是運行時可見的,當class文件被裝載時被保存在class文件中的Annotation才會被虛擬機讀取。下面代碼就是將Annotation信息提取出來,根據這些信息進行相應的操作。在這里是如果某個方法被標記為可以測試的則調用這個方法。
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.println("共運行了:"+(passed+failed)+"個方法,其中:\n失敗了:"+failed+",個,\n成功了:"+passed+"個!\n");} }
其中程序的主程序如下
public class RunTests {public static void main(String[] args) throws Exception{//處理Mytest類TestProcessor.process("annotation.MyTest");} }
運行結果如下
工作原理
上面僅僅是一個簡單地Annotation的使用,更復雜一些的Annotation與上面的這個例子原理是一樣的,只不過相應的邏輯判斷以及涉及到的Annotation中的內容較為復雜而已。但是核心的部分就是借助一個操作類通過反射的方式提取Annotation信息,進行操作,簡而言之:無反射,不注釋(Annotation)。
轉載于:https://www.cnblogs.com/beijiguangyong/archive/2013/03/18/2966593.html
總結
以上是生活随笔為你收集整理的Java中的Annotation(2)----Annotation工作原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的replace()函数介绍【
- 下一篇: XCode 4.3 不使用新特性 适用低