`

annotation学习

 
阅读更多
转自:http://www.son1c.cn/show/859.html

Java 自定义Annotation(元数据、注解)实战源码

如果您遇到任何问题,都可以到本站的[音速知道 ]系统中提问,互相学习,有问必答!

Annotation在java的世界正铺天盖地展开,有空写这一篇简单的annotations的文章,算是关于Annotation入门的文章吧,希望能各位们能抛砖,共同学习...... 
   不讲废话了,实践才是硬道理. 

   第一部分:了解一下java1.5起默认的三个annotation类型:  
   一个是@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。 
   一个是@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上. 
   一个是@SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭. 
   如果不清楚上面三个类型的具体用法,各位可以baidu或google一下的,很简单的。 

   第二部分:讲一下annotation的概念先,再来讲一下怎样设计自己的annotation.  
   首先在jdk自带的java.lang.annotation包里,打开如下几个源文件: 
   
   1、源文件Target.java 
Java 代码 
  1. @Documented   
  2. @Retention (RetentionPolicy.RUNTIME)  
  3. @Target (ElementType.ANNOTATION_TYPE)  
  4. public   @interface  Target {  
  5.    ElementType[] value();  
  6. }  

   
   其中的@interface是一个关键字,在设计annotations的时候必须把一个类型定义为@interface,而不能用class或interface关键字(会不会觉得sun有点吝啬,偏偏搞得与interface这么像). 
   
   2、源文件Retention.java 
Java代码 
  1. @Documented   
  2. @Retention (RetentionPolicy.RUNTIME)  
  3. @Target (ElementType.ANNOTATION_TYPE)  
  4. public   @interface  Retention {  
  5.    RetentionPolicy value();  
  6. }  


   看到这里,大家可能都模糊了,都不知道在说什么,别急,往下看一下. 
   在上面的文件都用到了RetentionPolicy,ElementType这两个字段,你可能就会猜到这是两个java文件.的确,这两个文件的源代码如下: 
   
   3、源文件RetentionPolicy.java 
Java代码 
  1. public   enum  RetentionPolicy {  
  2.  SOURCE,  
  3.  CLASS,  
  4.  RUNTIME  
  5. }  

   这是一个enum类型,共有三个值,分别是SOURCE,CLASS 和 RUNTIME. 
   SOURCE代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。 
   ClASS的意思是这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信 息加载到虚拟机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS. 
   第三个,是RUNTIME,表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的. 
  举一个例子,如@Override里面的Retention设为SOURCE,编译成功了就不要这一些检查的信息;相反,@Deprecated里面的 Retention设为RUNTIME,表示除了在编译时会警告我们使用了哪个被Deprecated的方法,在执行的时候也可以查出该方法是否被 Deprecated. 


   4、源文件ElementType.java 
Java代码 
  1. public   enum  ElementType {  
  2.  TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,  
  3.  LOCAL_VARIABLE, ANNOTATION_TYPE,PACKAGE  
  4. }  

   @Target里面的ElementType是用来指定Annotation类型可以用在哪一些元素上的.说明一下:TYPE(类型), FIELD(属性), METHOD(方法), PARAMETER(参数), CONSTRUCTOR(构造函数),LOCAL_VARIABLE(局部变量), ANNOTATION_TYPE,PACKAGE(包),其中的TYPE(类型)是指可以用在Class,Interface,Enum和 Annotation类型上. 
   另外,从1的源代码可以看出,@Target自己也用了自己来声明自己,只能用在ANNOTATION_TYPE之上. 
   如果一个Annotation类型没有指明@Target使用在哪些元素上,那么它可以使用在任何元素之上,这里的元素指的是上面的八种类型. 
   举几个正确的例子: 
   @Target(ElementType.METHOD) 
   @Target(value=ElementType.METHOD) 
   @Target(ElementType.METHOD,ElementType.CONSTRUCTOR)   
   具体参考一下javadoc文档 
   
   上面一下1和2的源文件,它们都使用了@Documented,@Documented的目的就是让这一个Annotation类型的信息能够显示在 javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息. 
   另外一点,如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个Annotation类型. 
   
   第三部分:下面讲的设计一个最简单的Annotation例子,这一例子共用四个文件;  
   1、Description.java 
Java代码 
  1. package  lighter.javaeye.com;  
  2.   
  3. import  java.lang.annotation.Documented;  
  4. import  java.lang.annotation.ElementType;  
  5. import  java.lang.annotation.Retention;  
  6. import  java.lang.annotation.RetentionPolicy;  
  7. import  java.lang.annotation.Target;  
  8.   
  9. @Target (ElementType.TYPE)  
  10. @Retention (RetentionPolicy.RUNTIME)  
  11. @Documented   
  12. public   @interface  Description {  
  13.     String value();  
  14. }  

   
   说明:所有的Annotation会自动继承java.lang.annotation这一个接口,所以不能再去继承别的类或是接口. 
   最重要的一点,Annotation类型里面的参数该怎么设定: 
   第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型. 
   第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String. 
   第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:上面的例子就只有一个参数成员. 

   2、Name.java 
Java代码 
  1. package  lighter.javaeye.com;  
  2.   
  3. import  java.lang.annotation.Documented;  
  4. import  java.lang.annotation.ElementType;  
  5. import  java.lang.annotation.Retention;  
  6. import  java.lang.annotation.RetentionPolicy;  
  7. import  java.lang.annotation.Target;  
  8.   
  9.  //注意这里的@Target与@Description里的不同,参数成员也不同   
  10. @Target (ElementType.METHOD)  
  11. @Retention (RetentionPolicy.RUNTIME)  
  12. @Documented   
  13. public   @interface  Name {  
  14.     String originate();  
  15.     String community();  
  16. }  


   3、JavaEyer.java 
Java代码 
  1. package  lighter.javaeye.com;  
  2.   
  3. @Description ( "javaeye,做最棒的软件开发交流社区" )  
  4. public   class  JavaEyer {  
  5.     @Name (originate= "创始人:robbin" ,community= "javaEye" )  
  6.     public  String getName()  
  7.     {  
  8.         return   null ;  
  9.     }  
  10.       
  11.     @Name (originate= "创始人:江南白衣" ,community= "springside" )  
  12.     public  String getName2()  
  13.     {  
  14.         return   "借用两位的id一用,写这一个例子,请见谅!" ;  
  15.     }  
  16. }  

   4、最后,写一个可以运行提取JavaEyer信息的类TestAnnotation 
Java代码 
  1.   package  lighter.javaeye.com;  
  2.   
  3.   import  java.lang.reflect.Method;  
  4.   import  java.util.HashSet;  
  5.   import  java.util.Set;  
  6.   
  7.   public   class  TestAnnotation {  
  8.     /**  
  9.      * author lighter  
  10.      * 说明:具体关天Annotation的API的用法请参见javaDoc文档  
  11.      */   
  12.        public   static   void  main(String[] args)  throws  Exception {  
  13.        String  CLASS_NAME = "lighter.javaeye.com.JavaEyer" ;  
  14.        Class  test = Class.forName(CLASS_NAME);  
  15.        Method[] method = test.getMethods();  
  16.        boolean  flag = test.isAnnotationPresent(Description. class );  
  17.         if (flag)  
  18.         {  
  19.             Description des = (Description)test.getAnnotation(Description.class );  
  20.             System.out.println("描述:" +des.value());  
  21.             System.out.println("-----------------" );  
  22.         }  
  23.           
  24.         //把JavaEyer这一类有利用到@Name的全部方法保存到Set中去   
  25.         Set<Method> set = new  HashSet<Method>();  
  26.         for ( int  i= 0 ;i<method.length;i++)  
  27.         {  
  28.             boolean  otherFlag = method[i].isAnnotationPresent(Name. class );  
  29.             if (otherFlag) set.add(method[i]);  
  30.         }  
  31.         for (Method m: set)  
  32.         {  
  33.             Name name = m.getAnnotation(Name.class );  
  34.             System.out.println(name.originate());  
  35.             System.out.println("创建的社区:" +name.community());  
  36.         }  
  37.      }  
  38. }  

    5、运行结果: 
     描述:javaeye,做最棒的软件开发交流社区 
     ----------------- 
    创始人:robbin 
    创建的社区:javaEye 
    创始人:江南白衣 
     创建的社区:springside 

这一篇文章写了两个小时有多啦,也算是一篇关于设计自定的Annotation的入门篇啦;
参考资料: 
1、http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html 
2、http://caterpillar.onlyfun.net/Gossip/ 

3、http://calvin.javaeye.com/blog/33210

转自:http://lighter.javaeye.com。

分享到:
评论

相关推荐

    Hibernate Annotation 学习笔记

    《Hibernate Annotation 学习笔记》 在Java的持久化框架中,Hibernate以其强大的功能和易用性成为开发者首选之一。而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML...

    Hibernate -annotation 学习笔记

    【Hibernate - Annotation 学习笔记】 Hibernate 是一个流行的开源Java对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据存储。Annotation是Hibernate提供的一种元...

    hibernate annotation学习文档

    ### Hibernate Annotation 学习知识点详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 巨具,它极大地简化了 Java 应用程序与数据库之间的交互过程。Hibernate 支持多种注解(Annotation),使得...

    Java Annotation学习整理.doc

    Java Annotation学习整理

    JAVA Annotation学习

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是关于数据的数据,可以提供额外的信息,这些...学习这些材料,将有助于你全面掌握Java注解的使用,并能够在实际项目中灵活运用。

    Java 5 annotation 学习笔记

    Java 5引入的注解(Annotation)是一种元数据,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、JVM或其他工具在编译时或运行时使用。注解可以用来简化代码,提高可维护性,并帮助工具进行静态分析。 1. ...

    Hiberate Annotation学习笔记

    Hibernate 注解是 Hibernate ORM 框架中用于对象关系映射的一种方式,它允许开发者在 Java 类的属性上直接添加元数据,从而简化配置并减少 XML 映射文件的使用。下面将详细讲解 Hibernate 注解的相关知识点。...

    考研英语GCC 中文手册.rar J2EE interview book Photo Frame Genius 2.3 破解版 Hiberate Annotation学习笔记 2008年11月份希赛模拟题 multisim 入门帮助文件和元件参数 精通PHP5 光盘源文件 深入理解LINUX 第三版 (英文) 清华大学严蔚敏数据结构(C版)配套光盘 破解万象2008玩免费 jsp学习详细

    考研英语GCC 中文手册.rar J2EE interview book Photo Frame Genius 2.3 破解版 Hiberate Annotation学习笔记 2008年11月份希赛模拟题 multisim 入门帮助文件和元件参数 精通PHP5 光盘源文件 深入理解LINUX 第三版 ...

    Spring MVC 2.5 annotation 学习

    博文链接:https://pesome.iteye.com/blog/236273

    第一章重难点之javaAnnotation学习整理.pdf

    Java Annotation,也称为注解,是Java编程语言中的一种元数据机制,用于向编译器、JVM或工具提供信息。这些信息可以用来执行编译时检查、运行时处理、文档生成等多种任务,使得代码更加易读、易维护,同时也为自动化...

    java annotation学习

    Java注解(Annotation)是Java语言的一个重要特性,它为代码提供了一种元数据,用于在编译时或运行时进行程序元素的处理。在Java中,注解是一种声明式编程方式,它允许程序员在代码中添加一些特殊标记,这些标记可以...

    study-annotation:Annotation学习

    本项目"study-annotation"旨在深入学习和理解Java注解的使用和实现机制。 首先,我们了解Java内置的注解类型,例如`@Override`、`@Deprecated`和`@ SuppressWarnings`。`@Override`确保方法重写了父类的方法,`@...

    Annotation--学习:JDK内建Annotation

    在Java编程语言中,Annotation(注解)是一种元数据,它提供了在编译时和运行时为代码添加信息的方式。注解是自Java 5版本引入的特性,它增强了代码的可读性和可维护性,同时也简化了某些编程任务。在本篇中,我们将...

    Spring IOC Annotation 注入 学习实例

    学习Spring IOC Annotation注入,首先需要理解Bean的生命周期,包括初始化、使用和销毁的过程。然后,通过编写带有注解的类,创建Bean定义,并让Spring容器管理这些Bean。容器会在适当的时间调用`@PostConstruct`...

    Hibernate Annotation 中文文档

    通过学习和掌握这些注解,开发者可以更轻松地处理数据库操作,同时也为项目带来更高的可维护性和可扩展性。随着Java社区对注解的广泛接受,Hibernate Annotation已经成为现代Java应用开发的标准实践,逐渐取代了传统...

Global site tag (gtag.js) - Google Analytics