• Java中的Annotation(2)----Annotation工作原理


    Java中的Annotation(2)----Annotation工作原理

    分类: 编程语言2013-03-18 01:06 3280人阅读 评论(6) 收藏 举报

    上一篇文章已经介绍了如何使用JDK的三个标准Annotation,本文将介绍Annotation的原理,以及如何自定义Annotation,并利用Annotation来完成一些实际的功能。

    定义Annotation

    定义新的Annotation类型使用@interface关键字,这从一定意义上说明Annotation和接口的定义是有相似之处的。如下代码定义了一个Annotation

    1.     //使用DK的元数据Annotation:Retention  
    2.     @Retention(RetentionPolicy.RUNTIME)  
    3.     //使用JDK的元数据Annotation:Target  
    4.     @Target(ElementType.METHOD)  
    5.     //定义一个标记注释,不包含任何成员变量,即不可传入元数据  
    6. public @interface Testable{  
    7.       
    8. }  

    使用Annotation

    定义了Annotation之后就可以在程序的任何地方使用该Annotation,对于Annotation的使用和public、final这样的修饰符很像,通常可以修饰类、方法、变量、接口等定义(默认情况下,Annotation用于修饰任何程序元素)。如下代码,就是使用了上面的Annotation修饰方法。

    1. public class MyTest {  
    2.     //使用@Testable标记注释指定该方法是可测试的  
    3.     @Testable  
    4.     public static void m1(){  
    5.           
    6.     }  
    7.     public static void m2(){  
    8.           
    9.     }  
    10.     //使用@Testable标记注释指定该方法是可测试的  
    11.     @Testable  
    12.     public static void m3(){  
    13.         throw new RuntimeException("Boom");  
    14.     }  
    15.     public static void m4(){  
    16.           
    17.     }  
    18.     //使用@Testable标记注释指定该方法是可测试的  
    19.     @Testable  
    20.     public static void m5(){  
    21.           
    22.     }  
    23.     public static void m6(){  
    24.           
    25.     }  
    26.     //使用@Testable标记注释指定该方法是可测试的  
    27.     @Testable  
    28.     public static void m7(){  
    29.         throw new RuntimeException("Crash");  
    30.     }  
    31.     public static void m8(){  
    32.           
    33.     }  
    34. }  

    提取Annotation

    一个类或者一个方法使用Annotation修饰之后需要通过反射来提取Annotation的信息。需要注意当一个Annotation类型被定义为运行时Annotation后该注释才是运行时可见的,当class文件被装载时被保存在class文件中的Annotation才会被虚拟机读取。下面代码就是将Annotation信息提取出来,根据这些信息进行相应的操作。在这里是如果某个方法被标记为可以测试的则调用这个方法。

    1. public class TestProcessor {  
    2.     public static void process(String clazz)throws ClassNotFoundException{  
    3.         int passed=0;  
    4.         int failed=0;  
    5.         //遍历obj对象的所有方法  
    6.         for(Method m :Class.forName(clazz).getMethods()){  
    7.             //如果包含@Testable标记注释  
    8.             if(m.isAnnotationPresent(Testable.class)){  
    9.                 try{  
    10.                     //调用m方法  
    11.                     m.invoke(null);  
    12.                     //passed加1  
    13.                     passed++;  
    14.                 }catch (Exception ex) {  
    15.                     System.out.printf("方法"+m+"运行失败,异常"+ex.getCause()+" ");  
    16.                     failed++;  
    17.                 }  
    18.             }  
    19.         }  
    20.         //统计测试结果  
    21.         System.out.println("共运行了:"+(passed+failed)+"个方法,其中: 失败了:"+failed+",个, 成功了:"+passed+"个! ");  
    22.     }  
    23. }  

    其中程序的主程序如下

    1. public class RunTests {  
    2.     public static void main(String[] args) throws Exception{  
    3.         //处理Mytest类  
    4.         TestProcessor.process("annotation.MyTest");  
    5.     }  
    6. }  

    运行结果如下

    工作原理

    上面仅仅是一个简单地Annotation的使用,更复杂一些的Annotation与上面的这个例子原理是一样的,只不过相应的逻辑判断以及涉及到的Annotation中的内容较为复杂而已。但是核心的部分就是借助一个操作类通过反射的方式提取Annotation信息,进行操作,简而言之:无反射,不注释(Annotation)

  • 相关阅读:
    LFI、RFI、PHP封装协议安全问题学习
    Django:(博客系统)添加文章(中文)出现UnicodeEncodeError乱码
    Django:(博客系统)使用使用mysql数据->后台管理tag/post/category的配置
    Spark:性能调优
    Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中
    C#:多进程开发,控制进程数量
    Django通过pycharm创建后,如何登录admin后台?
    扑克牌游戏研究先告一段落
    Zookeeper通过java创建、查看、修改、删除znode
    ZooKeeper:win7上安装单机及伪分布式安装
  • 原文地址:https://www.cnblogs.com/xiohao/p/4149625.html
Copyright © 2020-2023  润新知