JAVA进阶-注解

来源:互联网 发布:ubuntu gnome3 编辑:程序博客网 时间:2024/06/15 06:25

注解元数据分为4部分分别为Target,Documented,Inherited,Retention:


Target>指定被注解的注解只能使用在某个类型上;ElementType指定其类型:可以为方法
字段,类,返回值等等;

声明:
/** * @author Lean  @date:2014-10-13   */@Target(ElementType.METHOD)public @interface WorkInProgress {}

应用:
/** * @author Lean  @date:2014-10-13   */public class AnnotationSample {//当在字段中使用时:The annotation @WorkInProgress is disallowed for this location//@WorkInProgressprivate int age;@WorkInProgresspublic static boolean doSomeThing() {// TODO Auto-generated method stubreturn false;}}

Retention>设置注解可见性;使用到RetentionPolicy枚举
RetentionPolicy.SOURCE>>编译器可见,但对.class文件和运行时不可见;
RetentionPolicy.CLASS>>默认工具可见,对.class文件可见,但运行不可见;
RetentionPolicy.RUNTIME>>运行时可见;不会被.class文件所知,在运行时告诉JVM的值;
以下例子为运行时内省检查,当一个元注解需要多个限定值的时,必须使用{}和逗号隔开,
如@Target({ElementType.METHOD,ElementType.TYPE})

/** * @author Lean  @date:2014-10-13   */@WorkInProgresspublic class AnnotationSample {private int age;@WorkInProgresspublic static boolean doSomeThing() {// TODO Auto-generated method stubreturn false;}public static void main(String[] args) {AnnotationSample obj=new AnnotationSample();Class clazz=obj.getClass();WorkInProgress progress=(WorkInProgress) clazz.getAnnotation(WorkInProgress.class);System.out.println(clazz.getName());if (clazz.isAnnotationPresent(WorkInProgress.class)) {System.out.println("class Annotationed WorkInProgress!");}Method[] methods=clazz.getMethods();for (Method method : methods) {if (method.isAnnotationPresent(WorkInProgress.class)) {System.out.println("method Annotationed WorkInProgress!");}}}}@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,ElementType.TYPE})@interface WorkInProgress {}


Documented>为添加注解的类书写文档,编译运行后执行javadoc的dos命令.即可在该命令行

位置看到所生成的文档.

Inherited>当对某个类进行注解的时候,希望对继承他的子类也进行注解.默认情况下
没有使用该@Inherited注解方式,系统会认为子类不需要继承该功能,如下:

/** * @author Lean  @date:2014-10-13   */@WorkInProgresspublic class AnnotationSample {public static void main(String[] args) throws IllegalAccessException {AnnotationSample obj=new AnnotationSample();Class clazz=obj.getClass();if (clazz.isAnnotationPresent(WorkInProgress.class)) {System.out.println("class Annotationed WorkInProgress!");}Class childClass=AnnotationChildClass.class;if (childClass.isAnnotationPresent(WorkInProgress.class)) {System.out.println("child class Annotationed WorkInProgress!");}}}@Inherited@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,ElementType.TYPE})@interface WorkInProgress {}class AnnotationChildClass extends AnnotationSample{}

0 0
原创粉丝点击