Java自定义注解


一、什么是注释

说起注释,得先提一提什么是元数据(metadata)。所谓元数据就是数据的数据。也就是说,元数据是描述数据的。就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义。而J2SE5.0中提供的注释就是java源代码的元数据,也就是说注释是描述java源代码的。在J2SE5.0中可以自定义注释。使用时在@后面跟注释的名字。

二、J2SE5.0中预定义的注释

在J2SE5.0的java.lang包中预定义了三个注释。它们是Override、Deprecated和SuppressWarnings。下面分别解释它们的含义。

1.Override注释:仅用于方法(不可用于类、包的生命或其他),指明注释的方法将覆盖超类中的方法(如果覆盖父类的方法而没有注

释就无法编译该类),注释还能确保注释父类方法的拼写是正确(错误的编写,编译器不认为是子类的新方法,而会报错)

2.@Deprecated注释:对不应再使用的方法进行注释,与正在声明为过时的方法放在同一行。使用被     Deprecated注释的方法,编译器会

提示方法过时警告(”Warring”)

3.@SuppressWarnings注释:单一注释,可以通过数组提供变量,变量值指明要阻止的特定类型警告(忽略某些警告)。数组中的变量指明要阻止的警告@SuppressWarnings(value={”unchecked”,”fallthrough”}))

三、自定义注释@interface

  1. @Retention(RetentionPolicy.RUNTIME)  
  2. public @interface LogClass  
  3. {  
  4.     String type() default "";  
  5.     String comments() default "";  
  6. }  

 

  1. @Retention(RetentionPolicy.RUNTIME)  
  2. public @interface Anno {  
  3.     String name() default "zhangsan";  
  4. }  

自定义注解使用类:

  1. @Anno(name="ttttttt")  
  2. public class AnnotationImpl {  
  3.     @LogClass()  
  4.     public String getName() {  
  5.         return "aaaa";  
  6.     }  
  7.     @LogClass(comments="cccccc")  
  8.     public String getValue() {  
  9.         return "bbbb";  
  10.     }  
  11. }  

测试:

  1. public static void main(String[] args) throws Exception {  
  2.     Class<?> clazz = Class  
  3.             .forName("com.ronghai.hfms.support.upload.AnnotationImpl");  
  4.     Method[] method = clazz.getMethods();  
  5.     boolean flag = clazz.isAnnotationPresent(Anno.class);  
  6.     if (flag) {  
  7.         Anno first = (Anno) clazz.getAnnotation(Anno.class);  
  8.         System.out.println("Annotation:" + first.name());  
  9.     }  
  10.     for (int i = 0; i < method.length; i++) {  
  11.         LogClass log=method[i].getAnnotation(LogClass.class);  
  12.         if(log!=null){  
  13.             System.out.println(1+i+"、"+log.comments());  
  14.         }     
  15.     }  
  16. }  

输出结果:

Annotation:ttttttt
1、
2、cccccc

@Target:指定程序元定义的注释所使用的地方,它使用了另一个类:ElementType,是一个枚举类定义了注释类型可以应用到不同的程序元素以免使用者误用。

  1. public enum ElementType {  
  2.     /** Class, interface (including annotation type), or enum declaration */  
  3.     TYPE,  
  4.   
  5.     /** Field declaration (includes enum constants) */  
  6.     FIELD,  
  7.   
  8.     /** Method declaration */  
  9.     METHOD,  
  10.   
  11.     /** Parameter declaration */  
  12.     PARAMETER,  
  13.   
  14.     /** Constructor declaration */  
  15.     CONSTRUCTOR,  
  16.   
  17.     /** Local variable declaration */  
  18.     LOCAL_VARIABLE,  
  19.   
  20.     /** Annotation type declaration */  
  21.     ANNOTATION_TYPE,  
  22.   
  23.     /** Package declaration */  
  24.     PACKAGE  
  25. }  

@Retention:这个元注释和java编译器处理注释的注释类型方式相关,告诉编译器在处理自定义注释类型的几种不同的选择,需要使用RetentionPolicy枚举类。此枚举类只有一个成员变量,可以不用指明成名名称而赋值,看Retention的源代码: 

  1. public enum RetentionPolicy {  
  2.     SOURCE,  
  3.     CLASS,  
  4.     RUNTIME  
  5. }  
@Documented:是一个标记注释,表示注释应该出现在类的javadoc中,因为在默认情况下注释时不包括在javadoc中的。 

相关内容