Java - 给编译器看的Annotation

来源:互联网 发布:双十一套路 知乎 编辑:程序博客网 时间:2024/05/29 16:58

基础概念

[java] view plain copy
  1. package com.itlwc;  
  2.   
  3. // 枚举类型指定范围  
  4. enum RetentionPolicy {  
  5.     CLASS, // 只在编译之后class中起作用  
  6.     RUNTIME, // 在运行的时候起作用,因此可以反射性地读取  
  7.     SOURCE, // 只在源代码中起作用  
  8. }  
  9.   
  10. // 枚举类型指定作用范围  
  11. enum ElementType {  
  12.     ANNOTATION_TYPE, // 注释类型出现  
  13.     CONSTRUCTOR, // 构造方法出现  
  14.     FIELD, // 字段声明(包括枚举常量)出现  
  15.     LOCAL_VARIABLE, // 局部变量声明出现  
  16.     METHOD, // 方法声明出现  
  17.     PACKAGE, // 包声明出现  
  18.     PARAMETER, // 参数声明出现  
  19.     TYPE, // 类,接口(包括注释类型)或枚举声明出现  
  20. }  
  21.   
  22. // 文档注释格式,如果出现则其注释将出现在doc文档中  
  23. @interface Documented {  
  24. }  
  25.   
  26. // 指示注释类型的注释要保留多久,如果不存在Retention注释,则默认为RetentionPolicy.CLASS  
  27. @interface Retention {  
  28.     public RetentionPolicy value();  
  29. }  
  30.   
  31. // 可以出现在那些元素之上,如果不存在Target注释,则声明的类型可以用任意元素之上  
  32. @interface Target {  
  33.     public ElementType[] value();  
  34. }  
  35.   
  36. @Documented  
  37. @Retention(value = RetentionPolicy.SOURCE)  
  38. @Target(value = { ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR })  
  39. public class Test {  
  40.     public static void main(String[] args) {  
  41.   
  42.     }  
  43. }  

系统内置Annotation

[java] view plain copy
  1. @Override  
  2.     java.lang.Override,注解类型的  
  3.     声明  
  4.         @Target(value=METHOD)  
  5.         @Retention(value=SOURCE)  
  6.         public @interface Override  
  7.     用在方法之上,用来告诉编译器这个方法重写了父类的方法  
  8. @Deprecated  
  9.     java.lang.Deprecated,注解类型的  
  10.     声明  
  11.         @Documented  
  12.         @Retention(value=RUNTIME)  
  13.         public @interface Deprecated  
  14.     用在方法之上,表示方法不建议使用(表示有危险或者有更好的代替)  
  15. @SuppressWarnings  
  16.     java.lang.SuppressWarnings,注解类型的  
  17.     声明  
  18.         @Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})  
  19.         @Retention(value=SOURCE)  
  20.         public @interface SuppressWarnings  
  21.     括号里面的是value等于一个数组,表示方法是  
  22.         @SuppressWarnings(value={"unchecked","unused"})  
  23.         也可以写成下面这种  
  24.         @SuppressWarnings({"unchecked""unused"})  
  25. @Inherited  
  26.     java.lang.Inherited,注解类型的  
  27.     声明  
  28.         @Documented  
  29.         @Retention(value=RUNTIME)  
  30.         @Target(value=ANNOTATION_TYPE)  
  31.         public @interface Inherited  
  32.     表示一个Annotation能否被使用类的子类继承下去,如果没写,则无法继承  

自定义Annotation

[java] view plain copy
  1. package com.itlwc;  
  2.   
  3. enum Color {  
  4.     RED, GREEN, BLUE;  
  5. }  
  6.   
  7. @interface Annotation {  
  8.     public String key();  
  9.     //使用默认值  
  10.     public String value() default "牛小俊";  
  11.     //使用枚举  
  12.     public Color color() default Color.RED;  
  13.     //使用数组  
  14.     public String[] url();  
  15. }  
  16.   
  17. @Annotation(  
  18.         key = "lwc",  
  19.         value = "李文超",  
  20.         color = Color.GREEN,  
  21.         url = { "www.baidu.com""www.guge.com" }  
  22. )  
  23. public class Test {  
  24.   
  25. }  

通过反射取得方法上所有Annotation

[java] view plain copy
  1. package com.itlwc;  
  2.   
  3. import java.lang.annotation.Annotation;  
  4. import java.lang.reflect.Method;  
  5.   
  6. class Info {  
  7.     @Override  
  8.     @Deprecated  
  9.     @SuppressWarnings(value = "")  
  10.     public String toString() {  
  11.         return "hello";  
  12.     }  
  13. }  
  14.   
  15. public class Test {  
  16.     public static void main(String[] args) throws Exception {  
  17.         Class<?> cls = Class.forName("com.itlwc.Info");  
  18.         Method methods = cls.getMethod("toString");  
  19.         Annotation[] annotations = methods.getAnnotations();  
  20.         for (Annotation a : annotations) {  
  21.             System.out.println(a);  
  22.         }  
  23.     }  
  24. }  
  25.   
  26. /* 
  27. 打印结果:  
  28.     @java.lang.Deprecated() 
  29.     这个例子说明了Runtime中只能找到@Deprecated 
  30. */  
0 0
原创粉丝点击