码迷,mamicode.com
首页 > 编程语言 > 详细

Java 注解机制

时间:2015-03-19 21:35:48      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

一、注解中的信息已经在Class中了,我们应该如何读取出来

技术分享
1 java.lang.reflect.AnnotatedElement接口:
2 
3 public Annotation[] getAnnotation(Class annotationType);
4 
5 public Annotation[] getDeclaredAnnotations();
6 
7 public Boolean isAnnotationPresent(Class annotationType);
View Code

    Class 、Constructor、Field、Method、Package等类别,都实现了AnnotatedElement接口,既然Class 、Constructor、Field、Method、Package等类别,都实现了AnnotatedElement接口,显然它们都可以去调用AnnotatedElement里面的方法,以上各方法是定义在这个接口中的,定义Annotation时必须设定RententionPolicy为RUNTIME,也就是可以在VM中读取Annotation信息

 二、通过反射的方式读取作用在类、方法上面所修饰的注解信息。

1、public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

这句代码表示:annotationClass指定的注解,如果存在于方法的上面,就返回一个true,这个方法主要是用来判断某个方法上面是否存在注解。

2、public <T extends Annotation> T getAnnotation(Class<T> annotationClass)

会返回一个Annotation这样一个对象,参数里边儿是一个具体的Annotation Class对象,如果这样一个Annotation存在的话,才会返回这个Annotation。否则返回一个空值

3、Class<? extends Annotation> annotationType()

返回注解所对应的Class对象。

三、限定annotation使用对象

@Target

使用java.lang.annotation.Target可以定义其使用之时机,就是限定可以在什么地方可以使用注解:如方法、类、成员属性、变量,在定义时要指定java.lang.annotation.ElementType的枚举值之一,以此来表示这个注解可以修饰哪些目标。

package java.lang.annotation

public Enum ElementType{

         TYPE,//适用class,interface,enum

         FIELD,//适用field

         METHOD,//适用method

         PARAMETER,//适用method之上的parater

         CONSTTRUCTOR,//适用constructor

         LOCAL_VARIABLE,//适用局部变量

         ANNOTATION_TYPE,//适用annotation型态

         PACKAGE//适用package

}

技术分享
 1 package com.javase.annotation;
 2 import java.lang.annotation.ElementType;
 3 import java.lang.annotation.Target;
 4 /**
 5  * 自定义一个注解,这个注解只能修饰方法
 6  * @author x_xiongjie
 7  *
 8  */
 9 @Target(ElementType.METHOD)
10 public @interface MyTarget {
11     String value();
12 }
13 
14 package com.javase.annotation;
15 
16 public class MyTargetTest {
17     @MyTarget(value="zhangsan")
18     public void doSomething(){
19         System.out.println("hello world");
20     }
21 }
View Code

四、要求为API文件@Documented

    在制作JavaDoc文件的同时,如果想要将Annotation的内容也加入到API文件中,需要使用java.lang.annotation.Documented,则在在生成java doc的时候,将注解信息也生成到java doc中。

技术分享
 1 package com.javase.annotation;
 2 import java.lang.annotation.Documented;
 3 
 4 @Documented
 5 public @interface DocumentedAnnotation {
 6     String hello();
 7 }
 8 package com.javase.annotation;
 9 
10 public class DocumentedTest {
11     @DocumentedAnnotation(hello="welcome")
12     public void method(){
13         System.out.println("helloworld");
14     }
15 }
View Code

五、@Inherited

    在定义Annotation时加上java.lang.annotation.Inherited形态的Annotation,Inherited表示一个注解信息是否可以被自动继承下来,如果在注解中加上Inherited注解,就会由父类中被子类继承下来。

六:总结

1、要知道注解的本源是什么,如何去定义注解。

2、如何使用反射的方式去解析注解的信息,并且去解析注解下面所修饰的类、方法。根据注解是否存在注解的值到底是什么,来去调用对应的方法,或者处理对应的类。这个是很重要的,将RetentionPolicy设置为RUNTIME就可以得到。

 

Java 注解机制

标签:

原文地址:http://www.cnblogs.com/sunfie/p/4351458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!