java注解应用实例 - Annotation, 自定义注解, 注解类规则

标签: java 注解 应用 | 发表时间:2012-01-29 21:35 | 作者:
出处:http://www.iteye.com

本文介绍了java的自定义注解及注解类编写的规则, 并通过实例来说明下如何使用java的注解. 实例演示了注解在类,构造方法,方法和字段的使用. 可以从这里下载到完成的工程代码: http://dl.iteye.com/topics/download/f74972df-234f-30c9-aadd-ca2ed1376bc2

自定义注解类编写的一些规则:

1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.

2. 参数成员只能用public或默认(default)这两个访问权修饰

3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组.

4. 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法

5. 注解也可以没有定义成员, 不过这样注解就没啥用了

自定义注解类时, 可以指定目标 (类、方法、字段, 构造函数等) , 注解的生命周期(运行时,class文件或者源码中有效), 是否将注解包含在javadoc中及是否允许子类继承父类中的注解, 具体如下:

1. @Target 表示该注解目标,可能的 ElemenetType 参数包括:

ElemenetType.CONSTRUCTOR 构造器声明
ElemenetType.FIELD 域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE 局部变量声明
ElemenetType.METHOD 方法声明
ElemenetType.PACKAGE 包声明
ElemenetType.PARAMETER 参数声明
ElemenetType.TYPE 类,接口(包括注解类型)或enum声明

2. @Retention 表示该注解的生命周期,可选的 RetentionPolicy 参数包括

RetentionPolicy.SOURCE 注解将被编译器丢弃
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息

3. @Documented 指示将此注解包含在 javadoc 中

4.  @Inherited 指示允许子类继承父类中的注解

好, 该介绍的介绍了, 看下自定义的注解应用实例:

1. 首先看下定义的注解类:

类注解定义, MyClassAnnotation.java:

[java] view plain copy
  1. package  com.ross.annotation;  
  2. import  java.lang.annotation.*;  
  3. /**  
  4.  * Author: Jiangtao He; Email: [email protected]  
  5.  * Date: 2012-1-29  
  6.  * Since: MyJavaExpert v1.0  
  7.  * Description: class annotation  
  8.  */   
  9. @Retention (RetentionPolicy.RUNTIME)   
  10. @Target (ElementType.TYPE)   
  11. public   @interface  MyClassAnnotation   
  12. {  
  13.     String uri();  
  14.     String desc();  
  15. }  
默认构造方法注解定义,MyConstructorAnnotation.java: 
[java] view plain copy
  1. package  com.ross.annotation;  
  2. import  java.lang.annotation.ElementType;  
  3. import  java.lang.annotation.Retention;  
  4. import  java.lang.annotation.RetentionPolicy;  
  5. import  java.lang.annotation.Target;  
  6. /**  
  7.  * Author: Jiangtao He; Email: [email protected]  
  8.  * Date: 2012-1-29  
  9.  * Since: MyJavaExpert v1.0  
  10.  * Description: Constructor annotation  
  11.  */   
  12. @Retention (RetentionPolicy.RUNTIME)   
  13. @Target (ElementType.CONSTRUCTOR)   
  14. public   @interface  MyConstructorAnnotation   
  15. {  
  16.     String uri();  
  17.     String desc();  
  18. }  
方法注解定义,MyMethodAnnotation.java:
[java] view plain copy
  1. package  com.ross.annotation;  
  2. import  java.lang.annotation.ElementType;  
  3. import  java.lang.annotation.Retention;  
  4. import  java.lang.annotation.RetentionPolicy;  
  5. import  java.lang.annotation.Target;  
  6. /**  
  7.  * Author: Jiangtao He; Email: [email protected]  
  8.  * Date: 2012-1-29  
  9.  * Since: MyJavaExpert v1.0  
  10.  * Description: method annotation  
  11.  */   
  12. @Retention (RetentionPolicy.RUNTIME)   
  13. @Target (ElementType.METHOD)   
  14. public   @interface  MyMethodAnnotation   
  15. {  
  16.     String uri();  
  17.     String desc();  
  18. }  
字段注解定义, MyFieldAnnotation.java:
[java] view plain copy
  1. package  com.ross.annotation;  
  2. import  java.lang.annotation.ElementType;  
  3. import  java.lang.annotation.Retention;  
  4. import  java.lang.annotation.RetentionPolicy;  
  5. import  java.lang.annotation.Target;  
  6. /**  
  7.  * Author: Jiangtao He; Email: [email protected]  
  8.  * Date: 2012-1-29  
  9.  * Since: MyJavaExpert v1.0  
  10.  * Description: field annotation  
  11.  */   
  12. @Retention (RetentionPolicy.RUNTIME)   
  13. @Target (ElementType.FIELD)   
  14. public   @interface  MyFieldAnnotation   
  15. {  
  16.     String uri();  
  17.     String desc();  
  18. }  
2. 再看下我们注解的应用和测试:

在类上面使用了MyClassAnnotation注解, 默认构造方法上使用了MyConstructorAnnotation注解,  自定义方法上使用了MyMethodAnnotation注解, 自定义字段上使用了MyFieldAnnotation注解, 在Mail函数中则实现了访问这些注解,并打印注解信息.

MySample.java:

[java] view plain copy
  1. package  com.ross.annotation;  
  2. import  java.lang.reflect.*;  
  3. /**  
  4.  * Author: Jiangtao He; Email: [email protected]  
  5.  * Date: 2012-1-29  
  6.  * Since: MyJavaExpert v1.0  
  7.  * Description: This class is used to show how to use the annotation of each level  
  8.  */   
  9. @MyClassAnnotation (uri =  "com.ross.MySample" , desc =  "The class name" )  
  10. public   class  MySample  
  11. {  
  12.     @MyFieldAnnotation (uri =  "com.ross.MySample#id" , desc =  "The class field" )  
  13.     public  String id;  
  14.   
  15.     /**  
  16.      * Description: default constructor  
  17.      */   
  18.     @MyConstructorAnnotation (uri =  "com.ross.MySample#MySample" , desc =  "The default constuctor" )  
  19.     public  MySample()  
  20.     {  
  21.     }  
  22.   
  23.     /**  
  24.      * Description: normal method  
  25.      */   
  26.     @MyMethodAnnotation (uri =  "com.ross.MySample#setId" , desc =  "The class method" )  
  27.     public   void  setId(String id)  
  28.     {  
  29.         this .id = id;  
  30.     }  
  31.   
  32.     /**  
  33.      * Description: MyAnnotation test  
  34.      * @throws NoSuchMethodException   
  35.      * @throws SecurityException   
  36.      * @throws NoSuchFieldException   
  37.      */   
  38.     public   static   void  main(String[] args)  throws  SecurityException,  
  39.             NoSuchMethodException, NoSuchFieldException  
  40.     {  
  41.         MySample oMySample = new  MySample();  
  42.         // get class annotation   
  43.         MyClassAnnotation oMyAnnotation = MySample.class   
  44.                 .getAnnotation(MyClassAnnotation.class );  
  45.         System.out.println("Class's uri: "  + oMyAnnotation.uri() +  "; desc: "   
  46.                 + oMyAnnotation.desc());  
  47.   
  48.         // get constructor annotation   
  49.         Constructor oConstructor = oMySample.getClass().getConstructor();  
  50.         MyConstructorAnnotation oMyConstructorAnnotation = (MyConstructorAnnotation) oConstructor  
  51.                 .getAnnotation(MyConstructorAnnotation.class );  
  52.         System.out.println("Constructor's uri: "   
  53.                 + oMyConstructorAnnotation.uri() + "; desc: "   
  54.                 + oMyConstructorAnnotation.desc());  
  55.   
  56.         // get method annotation   
  57.         Method oMethod = oMySample.getClass().getDeclaredMethod("setId" ,String. class );  
  58.         MyMethodAnnotation oMyMethodAnnotation = oMethod  
  59.                 .getAnnotation(MyMethodAnnotation.class );  
  60.         System.out.println("Method's uri: "  + oMyMethodAnnotation.uri()  
  61.                 + "; desc: "  + oMyMethodAnnotation.desc());  
  62.   
  63.         // get field annotation   
  64.         Field oField = oMySample.getClass().getDeclaredField("id" );  
  65.         MyFieldAnnotation oMyFieldAnnotation = oField  
  66.                 .getAnnotation(MyFieldAnnotation.class );  
  67.         System.out.println("Field's uri: "  + oMyFieldAnnotation.uri()  
  68.                 + "; desc: "  + oMyFieldAnnotation.desc());  
  69.   
  70.     }  
  71.   
  72. }  

控制台打印结果:

[plain] view plain copy
  1. Class's uri: com.ross.MySample; desc: The class name  
  2. Constructor's uri: com.ross.MySample#MySample; desc: The default constuctor  
  3. Method's uri: com.ross.MySample#setId; desc: The class method  
  4. Field's uri: com.ross.MySample#id; desc: The class field  

至此本实例就完成了, 其实就是抓住两点一个是定义注解类,另外一个是如何访问注解, 就算是学会了.

注:  转载请注明出处: http://hejiangtao.iteye.com用于商业得给我分成 大笑





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 注解 应用] 推荐:

Java-了解注解及其应用

- - BlogJava-qileilove
  注解就是一种标记,在程序中加了注解就等于加了标记,没加,就没有标记. java编译器、开发工具或是其他程序可以通过反射技术了解你的类或各种元素是否有标记,有什么标记就做什么. 比如:子类重写父类的方法,方法上必须有@override标记;若一个方法已过时不用了,就该方法添加注.   解@Deprecated,调用者反射时就明白这方法已过时.

java注解应用实例 - Annotation, 自定义注解, 注解类规则

- - ITeye博客
本文介绍了java的自定义注解及注解类编写的规则, 并通过实例来说明下如何使用java的注解. 实例演示了注解在类,构造方法,方法和字段的使用. 可以从这里下载到完成的工程代码: http://dl.iteye.com/topics/download/f74972df-234f-30c9-aadd-ca2ed1376bc2.

Java应用运维

- - BlueDavy之技术blog
对于互联网产品或长期运行的产品而言,运维工作非常重要,尤其是在产品复杂了以后,在这篇blog中就来说下Java应用的运维工作(ps:虽然看起来各种语言做的系统的运维工作都差不多,但细节上还是会有很多不同,so本文还是只讲Java的). 苦逼的码农按照需求开发好了一个全新的Java Web应用,该发布上线给用户用了,要把一个Java Web应用发布上线,首先需要搭建运行的环境,运行的环境需要有JDK、APPServer,在已经装好了os的机器上装上JDK和APPServer,开发好的Java Web应用可以用maven直接打成war或ear,将这个打好的包scp或其他方式到目标机器上,准备妥当,就差启动了.

Java线程池应用

- - CSDN博客架构设计推荐文章
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务. 2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机). Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具.

Java 应用一般架构

- - SegmentFault 最新的文章
原文地址: https://blog.coding.net/blog/General-architecture-for-Java-applications. 当我们架设一个系统的时候通常需要考虑到如何与其他系统交互,所以我们首先需要知道各种系统之间是如何交互的,使用何种技术实现. 现在我们常见的不同系统不同语言之间的交互使用WebService,Http请求.

xssProject在java web项目中应用

- - Java - 编程语言 - ITeye博客
1.项目引入xssProtect-0.1.jar、antlr-3.0.1.jar、antlr-runtime-3.0.1.jar包. * 覆盖getParameter方法,将参数名和参数值都做xss过滤. * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
.

使用Gradle构建Java Web应用(译)

- - BlogJava-首页技术区
使用Gradle构建Java Web应用. 本文是发布在 java.net上的一篇摘自于一书中的 节选,介绍了使用 Gradle构建Java Web应用的过程. 刚刚接触Gradle,看到了这篇小文,随手译了出来:-) (2014.01.23最后更新). 在职业生涯和私人生活中,我们中间的许多人要同时管理多个项目.

消除Java应用中的Exception开销

- - 舒の随想日记
抛异常最大的消耗在于构造整个异常栈的过程,如果你的栈很深,特别是用了一些框架的话,这个开销基本是不可忽视的,之前做的一个优化显示当时应用中的一个异常使得整个应用的性能下降至少30%. 最大开销的地方在这里,当你去new一个Exception的时候,会调用父类Throwable的构造函数, Throwable的构造函数中会调用native的fillInStackTrace(),这个方法就会构造整个异常栈了.

JAVA 应用性能监控基础

- - Linux - 操作系统 - ITeye博客
       这里简单介绍了JAVA 应用程序部署linux 服务器上的一些常用监控信息,虽然现在很多自动化监控的东西,但是一些基本的东西,我们还是需要了解.        1.我习惯性先看看 CPU 和内存的使用情况,做一个简单的关注.           命令:top 可以关注运行状态.           命令:大写P:按CPU 使用排序,大写M:按内存使用排序,小写c:详细显示应用       .

使用Java注解进行Spring bean管理

- - 编程语言 - ITeye博客
原文链接: http://www.ibm.com/developerworks/cn/webservices/ws-springjava/. 使用 Java 配置进行 Spring bean 管理. 学习使用 Java 配置管理 Spring bean. Spring bean 是使用传统的 XML 方法配置的.