什么是注解
从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。
为什么要自定义注解
自定义注解常与反射相结合,比如自己写的框架为了方便使用,通过注解的形式暴露给使用者进行使用,从而提高应用的灵活性。
一个注解
public @interface DemoAnnotation {
}
上面就是一个最简单的注解,通过 @DemoAnnotation
标注在类、方法上使用,但是我们一般在定义注解的时候会和其它注解联合定义,用于限制自定义注解的生命周期和使用范围。
限制自定义注解的
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface DemoAnnotation {
}
- @Retention:表明该注解的生命周期
- @Target:确定该注解的使用范围
Target
- ElementType.TYPE 应用于类、接口(包括注解类型)、枚举
- ElementType.FIELD 应用于属性(包括枚举中的常量)
- ElementType.METHOD 应用于方法
- ElementType.PARAMETER 应用于方法的形参
- ElementType.CONSTRUCTOR 应用于构造函数
- ElementType.LOCAL_VARIABLE 应用于局部变量
- ElementType.ANNOTATION_TYPE 应用于注解类型
- ElementType.PACKAGE 应用于包
- ElementType.TYPE_PARAMETER 1.8版本新增,应用于类型变量)
- ElementType.TYPE_USE 1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型)
@Retention
- RetentionPolicy.SOURCE 编译时被丢弃,不包含在类文件中
- RetentionPolicy.CLASS JVM加载时被丢弃,包含在类文件中,默认值
- RetentionPolicy.RUNTIME 由JVM 加载,包含在类文件中,在运行时可以被获取到
自定义注解的属性
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface DemoAnnotation {
String value() default "";// 设置value属性,默认为空字符
}
可以在使用该注解的时候添加value值,示例如下:

判断一个类是否标注指定注解
现在有一个Demo类被标注**@DemoAnnotation(value="demo")注解,我们Class内置方法判断是否Demo**类是否被标注。
Demo demo = new Demo();
Class<? extends Demo> aClass = demo.getClass();
// 判断Demo类上是否存在 DemoAnnotation.class 类型的注解,存在返回true
boolean annotationPresent = aClass.isAnnotationPresent(DemoAnnotation.class);
System.out.println(annotationPresent);
DemoAnnotation annotation = aClass.getAnnotation(DemoAnnotation.class);
// 获取该注解的value值
System.out.println(annotation.value());
运行结果:

其它
当然,我们在项目开发中不可能每次都通过这样进行判断,一般我们都是通过Aop切面编程或者是拦截器的方式进行判断是否标注指定注解,然后我们根据实际的业务情况进行处理。