`

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

    博客分类:
  • java
阅读更多

本文介绍了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: ross.jiangtao.he@gmail.com  
  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: ross.jiangtao.he@gmail.com  
  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: ross.jiangtao.he@gmail.com  
  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: ross.jiangtao.he@gmail.com  
  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: ross.jiangtao.he@gmail.com  
  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 用于商业得给我分成大笑

5
3
分享到:
评论
2 楼 whatlonelytear 2018-07-27  
1 楼 beiyeren 2013-03-02  
写的不错啊

相关推荐

    Java自定义注解实例

    3. **使用**: 在代码中,可以将自定义注解应用于目标元素,如: ```java public class MyClass { @MyAnnotation(value = "Hello, World!") public void myMethod() { // ... } } ``` ### 三、注解处理器 ...

    Java注解学习1-Java Annotation认知(包括框架图、详细介绍、示例说明)

    Java 注解(Annotation)是自 JDK 5.0 版本引入的一种元数据机制,用于向编译器、开发工具和运行时系统提供有关代码的附加信息。它们并不直接影响程序的执行,但可以用于代码分析、编译时验证或者运行时处理。本文将...

    前端项目-chartjs-plugin-annotation.zip

    **Chart.js插件-Annotation详解** 在前端开发中,数据可视化是至关重要的,它能够将复杂的数据以图形的形式展示,使用户更容易理解。Chart.js是一个轻量级且强大的JavaScript库,用于创建各种图表,如折线图、柱状...

    hibernate-Annotation.jar

    Annotation注解可以直接应用在类和类的属性上,减少了额外的配置文件需求,提升了开发效率。 1. **实体类注解@Entity** `@Entity` 注解标记一个Java类为Hibernate管理的实体类,表示这个类将映射到数据库的一个表...

    Java 注解Annotation实例上手文档

    ### Java 注解Annotation实例上手文档 #### 一、引言与基础知识 Java注解(Annotation)自JDK 5.0引入以来,已经成为Java语言的重要特性之一,它为代码元数据提供了一种标准化的方式,使得编译器、工具和其他框架...

    自定义注解得使用,模拟spring通过注解方式创建bean实例

    @Target(ElementType.TYPE) // 表示该注解应用于类 @Retention(RetentionPolicy.RUNTIME) // 表示该注解在运行时可见 public @interface MyComponent { String value() default ""; // 可选的默认值 } ``` 接下来...

    hibernate-annotation 所需要的jar包

    3. **Hibernate Annotation**: Hibernate的注解是在Java类和属性上添加元数据的方式,它替代了传统的Hibernate XML配置文件。通过注解,可以在实体类和属性上直接定义数据库映射,如@Entity表示一个数据库表,@Table...

    java 自定义注解例子

    在这个例子中,我们通过`isAnnotationPresent`方法检查`Product`类上是否存在`SoldOut`注解,如果存在,则通过`getAnnotation`获取注解实例并读取其属性。 自定义注解还可以与处理器(Annotation Processor)结合,...

    spring-boot-annotation-spel.zip

    本压缩包“spring-boot-annotation-spel.zip”显然是关于如何在自定义注解中运用SPEL表达式的实例教程。 SPEL是Spring框架提供的一种强大的表达式语言,用于在运行时查询和操作对象图。它允许我们执行各种操作,如...

    探索Java注解的神秘世界:Annotation全解析

    - `getAnnotation` 方法用于获取应用到类或方法上的自定义注解实例。 - 反射机制用于在运行时获取注解信息并打印出来。 ### Java 注解的应用场景 Java 注解在实际开发中有多种用途,以下是一些常见的应用场景: 1...

    Spring注解驱动开发实战-annotation

    而在注解驱动开发中,我们可以通过在类上使用@Component(或其子注解@Service、@Repository、@Controller)来标记一个类为Spring管理的组件。例如: ```java @Service public class UserService { // ... } ``` ...

    在Nutz中使用Ioc-Annotation的入门教程

    在Nutz中,任何类都可以成为一个Bean,只要它被`@org.nutz.ioc.annotation.Injectable`注解或者包含在某个包下,该包已被配置为扫描范围。Bean的生命周期和作用域可以通过`@org.nutz.ioc.annotation.Inject`的`value...

    java5.0新特性总结--Annotation系统学习整理笔记

    这篇博客是关于Java 5.0新特性——Annotation的系统学习与整理笔记,通过讲解与实例,深入探讨了注解在Junit、Spring和Hibernate中的应用。 首先,注解是一种声明式的编程元素,它可以附加到类、接口、方法、变量等...

    java注解源码-Spring-Configuration-using-Annotation-and-Java-Source-Code:Spr

    本项目“Spring-Configuration-using-Annotation-and-Java-Source-Code”深入探讨了如何使用Java注解来构建Spring应用的配置。以下是关于Java注解和Spring框架在配置中的应用的详细知识点: 1. **Java注解**: - ...

    aixos-ts-encapsulation_自定义注解_

    描述中提到的“自定义注解生成单例工厂的实例”意味着开发者可能已经创建了一个注解,当应用到类上时,该注解会自动将这个类转换为一个单例模式的工厂。这通常涉及到装饰器(Decorator)的概念,装饰器是TypeScript...

    spring-boot-mybatis-annotation-mulidatasource.zip_REVL_TSPS_myba

    在应用启动时,Spring Boot会自动发现mybatis-spring-boot-starter依赖,并配置好SqlSessionFactory和MapperScannerConfigurer,这样我们无需编写大量配置文件,只需在Java类上添加注解即可。 在多数据源的实现中,...

    自定义注解Result实例

    接下来,我们可以将这个自定义注解应用到方法上,以指示该方法的返回结果: ```java public class Service { @Result(message = "获取用户信息成功", code = 200) public User getUserInfo(String userId) { //...

    基于Java的实例源码-的UIMA注解类 uimaFIT.zip

    这些注解可以将Java类直接转换为UIMA分析引擎,减少了代码和XML配置之间的映射工作。 3. **组件定义**:在UIMAFIT中,可以使用`@TypeSystem`注解来指定组件使用的类型系统,这包括所有的注解类型。`@...

    0006-自定义注解与设计模式.zip

    可以通过`AnnotatedElement`接口的`getAnnotation`方法获取注解实例,然后访问其元素。 其次,设计模式是面向对象设计中的一种最佳实践,是对常见问题的解决方案。它们是经过时间考验,被广泛接受并多次成功应用的...

    struts2-Annotation

    - 在`src`目录下的Java类中,你可能会看到如`@Action`、`@Result`等注解的实例,它们指示Struts2如何处理特定的HTTP请求和响应。 - `WebContent`目录下的资源文件(如JSP、HTML)和静态内容会被服务器直接发送给...

Global site tag (gtag.js) - Google Analytics