读书人

JDK5.0新特性Annotation之@Retention诠

发布时间: 2012-06-26 10:04:13 作者: rapoo

JDK5.0新特性Annotation之@Retention注解

直接代码说话,说明信息详见注释。。

首先是自定义的使用@Retention标注的注解----MyAnnotation.java

[java]?view plaincopyprint?
  1. package?com.jadyer.annotation.retention;??
  2. ??
  3. import?java.lang.annotation.Retention;??
  4. import?java.lang.annotation.RetentionPolicy;??
  5. ??
  6. @Retention(RetentionPolicy.RUNTIME)??
  7. public?@interface?MyAnnotation?{??
  8. ????String?hello()?default?"haerbin";??
  9. ????String?world();??
  10. }??
  11. /*********************【@Retention用来告知编译程序如何处理注解】********************************************************/??
  12. //java.lang.annotation.Retention型态可以在定义Annotation型态时,指示编译程序如何对待自定义的Annotation型态??
  13. //预设上编译程序会将Annotation信息留在.class档案中,但不被虚拟机读取,仅用于编译程序或工具程序运行时提供信息??
  14. //在使用Retention型态时,需要提供java.lang.annotation.RetentionPolicy的枚举型态??
  15. //java.lang.annotation.RetentionPolicy.CLASS----默认值。编译程序将Annotation储存于class档中??
  16. //java.lang.annotation.RetentionPolicy.SOURCE---编译程序处理完Annotation信息后就完成任务??
  17. //??????????????????????????????????????????????该注释将不被记录在类文件中,而只是存在于.java文件中??
  18. //java.lang.annotation.RetentionPolicy.RUNTIME--编译程序将Annotation储存于class档中,可由JVM读入??
  19. //??????????????????????????????????????????????即编译器将把注释记录在类文件中,在运行时JVM将保留注释??
  20. //??????????????????????????????????????????????故可搭配反射(Reflection)机制让JVM读取Annotation信息??
  21. /*********************【@SuppressWarnings用来告知编译程序来抑制警告】***************************************************/??
  22. //其中@SuppressWarnings注解的RetentionPolicy就是SOURCE,即仅在编译时告知编译程序来抑制警告??
  23. //如果@SuppressWarnings中定义不存在的警告类型,那么程序也不会报错??
  24. //如果@SuppressWarnings中定义了重名的警告类型,那么后面的将全部被忽略掉??
  25. /*****************************************************************************************************************/??

?

然后是自定义的@MyAnnotation注解的测试类----MyTest.java

[java]?view plaincopyprint?
  1. package?com.jadyer.annotation.retention;??
  2. ??
  3. public?class?MyTest?{??
  4. ????@Deprecated??
  5. ????@SuppressWarnings("unchecked")??
  6. ????@MyAnnotation(hello?=?"beijing",?world?=?"chongqing")??
  7. ????public?void?output()?{??
  8. ????????System.out.println("output?something");??
  9. ????}??
  10. }??

?

最后利用反射机制读取MyTest.java中的Annotation信息的类----MyReflection.java

[java]?view plaincopyprint?
  1. package?com.jadyer.annotation.retention;??
  2. ??
  3. import?java.lang.annotation.Annotation;??
  4. import?java.lang.reflect.Method;??
  5. ??
  6. /**?
  7. ?*?利用反射机制,读取MyTest.java中的Annotation信息?
  8. ?*?@see?控制台打印结果,如下?
  9. ?*?@see?output?something?
  10. ?*?@see?beijing?
  11. ?*?@see?chongqing?
  12. ?*?@see?java.lang.Deprecated?
  13. ?*?@see?com.jadyer.annotation.retention.MyAnnotation?
  14. ?*/??
  15. public?class?MyReflection?{??
  16. ????public?static?void?main(String[]?args)?throws?Exception?{??
  17. ????????MyTest?myTest?=?new?MyTest();??
  18. ????????Class<MyTest>?c?=?MyTest.class;??
  19. ????????Method?method?=?c.getMethod("output",?new?Class[]{});??
  20. ??
  21. ????????//判断方法前面是否存在特定的Annotation??
  22. ????????if?(method.isAnnotationPresent(MyAnnotation.class))?{??
  23. ????????????//调用MyTest中的output()方法??
  24. ????????????method.invoke(myTest,?new?Object[]{});??
  25. ??????????????
  26. ????????????//获得某一具体的Annotation??
  27. ????????????MyAnnotation?myAnnotation?=?method.getAnnotation(MyAnnotation.class);??
  28. ??????????????
  29. ????????????//对于Annotation中的元素,赋值时可以把它当作属性,取出时可以把它当作方法??
  30. ????????????String?hello?=?myAnnotation.hello();??
  31. ????????????String?world?=?myAnnotation.world();??
  32. ??????????????
  33. ????????????System.out.println(hello);??
  34. ????????????System.out.println(world);??
  35. ????????}??
  36. ??
  37. ????????Annotation[]?annotations?=?method.getAnnotations();??
  38. ????????for?(Annotation?annotation?:?annotations)?{??
  39. ????????????//不会打印出@SuppressWarnings注解,因为它的RetentionPolicy是SOURCE??
  40. ????????????System.out.println(annotation.annotationType().getName());??
  41. ????????}??
  42. ????}??
  43. } ?

?

读书人网 >开源软件

热点推荐