阅读更多
java注解目前使用非常广泛,spring等框架都支持注解配置。其中注解Annotation的作用也比较明显:
1、可以生成文档;
2、可以简化配置;
3,在编译期间检查代码格式,如@override。
java定义注解是使用@interface声明,其中两个最主要的参数是@Retention(RetentionPolicy.RUNTIME)和
@Target(ElementType.TYPE)。Retention参数表示注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS ;它有三种取值(代表三个阶段): RetentionPolicy.SOURCE:保留注解到java源文件阶段,例如Override、SuppressWarnings ,RetentionPolicy.CLASS:保留注解到class文件阶段, RetentionPolicy.RUNTIME:保留注解到运行时阶段即内存中的字节码,可以反射性地读取注解里的信息,可通过以下代码验证:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ExportFormat {
Class> className();
}
@ExportFormat(className=SettlePathExportFormat.class)
public class SettlePathDto {
public static void main(String[] args) throws Exception {
SettlePathDto dto = new SettlePathDto();
Class clazz = dto.getClass();
ExportFormat a = (ExportFormat)clazz.getAnnotation(ExportFormat.class);
System.out.println(a.className());
}
}
运行以上代码,发现只有RetentionPolicy.RUNTIME时,才能正常运行,否则都会报空指针,因为main是在jvm运行时去读取注解里的信息。
@Target(ElementType.TYPE):表示注解的作用域,有TYPE(类级别)、FIELD(字段)、METHOD(方法)等。