最近在项目中用到了java的自定义注解,在解决问题之后,详细学习了java的自定注解的用法。
1、注解的作用
“注解”有注释、解释的含义。注解也是一种元数据,即是数据的数据,注解是描述java源代码信息的数据,是java源代码的元数据。
注解(Annotation)在代码中添加标记信息,之后我们可以通过解析注解来获取标记信息,完成某些动作。
SDK自带注解有以下几种:
2、自定义注解
不仅可以使用SDK自带注解,强大之处还在于我们可以自定义注解,实现定制功能。
注解的定义使用关键字“@interface ”。
public @interface MyAnnotation
{
public enum Enum{A, B, C}
public Enum value1() default Enum.A;
public Enum value2();
public String value3();
}
自定义注解的使用方式并无特殊之处。
@MyAnnotation(value2=MyAnnotation.MyEnum.B, value3 = “abc”)
public void myMethod()
{
//...
}
3、元注解
为了方便自定义注解,SDK为我们提供了几种元注解,就是“自定义注解”的注解。使用普通注解也可对注解进行注解,不过使用元注解提供了一些更好的特性。
3.1 Target
指明自定义注解的使用目标,例如类、方法、字段等,就是说这个注解可以使用在java的那些语言元素上。
如只允许对方法和构造函数进行注解可以写成:
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
public @interface MyAnnotation {}
3.2 Retention
给代码加上注解的目的就是为了读取注解,完成某些动作。但是注解只有被保存在class文件中才可以被读出来,Retention就是为设置注解是否保存在class文件中。
@Retention(RetentionPolicy.SOURCE)
@interface MyAnnotation1 { }
不将注解保存在class文件中,也就是说象“//”一样在编译时被过滤掉了。
@Retention(RetentionPolicy.CLASS)
@interface MyAnnotation2 {}
只将注解保存在class文件中,而使用反射读取注解时忽略这些注解。
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3 {}
将注解保存在class文件中,也可以通过反射读取注解。
3.3 Documented
与文档相关,若某个方法使用了“被Documented注解的注解”,那么生成文档时会记录下这个注解。
@Inherited
@interface MyAnnotation { }
@MyAnnotation
public class ParentClass {}
public class ChildClass extends ParentClass { }
4、读取注解
系统的注解都关联到一组动作中了,那么我们注解是不是也要关联到一组动作中才有意义,利用java的反射机制可以解析注解,为注解提供实际意义。
在此暂不做反射的研究,在项目中我们使用AOP的方式使自定义注解有了实际意义。