1.注解
Java1.5之后,出现了注解(annotation)。注解本身是一个类,用于对类中的元素进行修饰,然后编译器(javac),开发工具或其他程序可以通过注解来对类元素进行特定的操作。
2.元注解
定义注解的注解称为元注解。用于修饰注解,常见的元注解有:@Target, @Retention
@Target:用于说明注解在什么地方起作用。可选值如下:
Publicenum ElementType{
TYPE,//类,接口(包括注解),enum;
FIELD,//属性域
METHOD,//方法
PARAMETER,//参数
CONSTRUCTOR,//构造函数
LOCAL_VARIABLE,//局部变量
ANNOTATION_TYPE,//注解类型
PACKAGE,//包
/**
*Typeparameterdeclaration
*@since1.8
*/
TYPE_PARAMETER,//表明可以标注类型参数--有这个属性的注解只能修饰方法参数
/**
*Useofatype
*@since1.8
*/
TYPE_USE//可以注解任何类型名称--有这个参数的注解可以修饰所有形态名称(对象类型),比如泛型类型,参数类型、构造方法类型等都可以修饰。
}
@Target元注解是定义注解的必要组成部分。
@Retention:用来说明注解在什么地方保留。有三个可选值:
1)RetentionPolicy.SOURCE 保留在源码级别,被编译器抛弃,如@Override(如上@Override源码);
2)RetentionPolicy.CLASS 被编译器保留在编译后的class文件,但是被VM抛弃;
3)RetentionPolicy.RUNTIME 保留至运行时,可以被反射读取。如 @Retention 元注解本身。
** 引申1:如果定义一个注解需要被反射读取,则在定义这个注解的时候将添加@Retention(RetentionPolicy.RUNTIME) 元注解。这样才能保证在运行的代码中仍然拥有某个注解。
自定义注解:
在程序开发时,我们可能需要用到自定义注解来执行一些特殊的操作,比如判断方法是不是登录之后才能访问。
自定义注解固定格式:
@Target
@Retention
Public @Interface xxx{}
注解不能继承其他注解和接口。
为自定义注解定义参数:
在注解中,所有的参数都是以方法形式来体现的。
方法的返回值类型是参数类型,方法名是参数名(可以用AliasFor加别名),除基本数据类型以外,其他类型需要提供默认值,用default关键字修饰。
String value() default "";
参数名为value,类型为String,默认值为空字符串。
总结一下,注解其实就是一个类,用于对类元素进行修饰,让被修饰的元素能在java代码生命周期的各个阶段被加工。
在运行阶段如何获取注解:
我们需要通过AnnotatedElement对象来获取注解对象(反射包提供的接口)。比如method对象就是实现了一个实现上述接口的一个接口使得其能够直接获得注解对象。
其提供的主要方法如下:
//获取对象的所有注解
Annotation[] getAnnotations();
//获取对象的单个注解
<T extends Annotation> T getAnnotation (Class<T> annotationClass);
获取到注解之后我们就可以根据注解进行特定的操作咯。