annotation提供了四种元注解:
@Documented -- 注解是否将包含在javadoc中
@Retention --什么时候使用该注解
@Target 注解用于什么地方
@Inherited 是否允许资料基础该注解
RetentionPolicy.SOURCE 在编译阶段丢弃,不会写入字节码
RetentionPolicy.CLASS 在类加载时丢弃 注解默认使用这种
RetentionPolicy.RUNTIME 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息,自定义注解时常采用此种方式
@Target :
ElementType.TYPE
ElementType.FIELD
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE
ElementType.PACKAGE
Annotations只支持基本类型、string及枚举类型。注解种的缩影的舒心被定义成发放,并允许提供默认值
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Todo{
public enum Priority {LOW,HIGH}
public enum Status {YES, NO}
String author() default "Tim";
Priority pririty() default Priority.LOW;
Status status() default Status.NO;
}
@Todo(priority = Todo.Priority.MEDIUM, author = "yes", status = Todo.Status.NO)
public void incompleteMethod1(){
}
如果注解只有一个属性,可以直接命名value
@interface Author{
String value();
}
@Author("123")
public void someMethod(){}
定义自己的注解并将其应用到业务逻辑上,需要些一个用户程序调用我们的注解需要使用反射机制
Class clzss = xxx.class;
for(Method method : clzss.getMethods()){
Todo todo = (Todo)method.getAnnotation(Todo.class);
if(todo != null){
todo.author();
todo.status();
}
}