自定义注解
什么是注解?
从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。
**其实说白就是代码里的特殊标志,这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,以便于其他工具补充信息或者进行部署。**
JDK的元Annotation(元注解)?
jdk中包含了一些元注解,主要有@Target,@Retention,@Document,@Inherited,@Result用来修饰注解。
@Target
用于指定被修饰的注解能用于修饰哪些程序单元,@Target也包含了一个value值
取值 | 注解使用范围 |
METHOD | 可用于方法上 |
TYPE | 可用于类或者接口上 |
ANNOTATION_TYPE | 可用于注解类型上(被@interface修饰的类型) |
CONSTRUCTOR | 可用于构造方法上 |
FIELD | 可用于域上 |
LOCAL_VARIABLE | 可用于局部变量上 |
PACKAGE | 用于记录java文件的package信息 |
PARAMETER | 可用于参数上 |
@Retention
用于被修饰的注解可以保存多久,这个注解需要使用参数
生命周期类型 | 描述 |
---|---|
RetentionPolicy.SOURCE | 编译时被丢弃,不包含在类文件中 |
RetentionPolicy.CLASS | JVM加载时被丢弃,包含在类文件中,默认值 |
RetentionPolicy.RUNTIME | 由JVM 加载,包含在类文件中,在运行时可以被获取到 |
@Document
这个注解用于指定被修饰的注解类将被javadoc工具提取成文档(该注解了解即可)
@Inherited
这个注解指定被他修饰的注解将具有继承性——如果某个类使用了@Xxx,则其子类将自动被@Xxx修饰
" class="reference-link">SpringBoot启动类上默认用了以上的元注解
自定义注解?
1、定义一个注解接口,必须需要 @Retention元注解 标明生命周期,否则不会生效
package com.liu.annotation;
//自定义一个注解
//1、包含了public修饰符
//2、包含了@interface关键词
//3、TestAnno : 为具体的注解名称
//4、注解内容:可以理解为自定义接口
import java.lang.annotation.*;
@Target(value = {ElementType.FIELD,ElementType.TYPE})
@Documented
@Inherited
@Retention(value = RetentionPolicy.RUNTIME)
public @interface CustomAnno {
String name() default "阿军";
boolean flag();
}
2、写一个实体类,加上自定义注解
package com.liu.annotation;
@CustomAnno(flag = false,name = "程序员阿军")
public class Emp {
private String name;
private boolean flag;
@Override
public String toString() {
return "Emp{" +
"name='" + name + '\'' +
", flag=" + flag +
'}';
}
}
3、获取实体类的注解内容
package com.liu.annotation;
import java.lang.annotation.Annotation;
import java.util.Arrays;
public class TestAnno {
public static void main(String[] args) {
//获取Emp类注解信息
Class<Emp> empClass = Emp.class;
CustomAnno customAnno = empClass.getAnnotation(CustomAnno.class);
System.out.println(customAnno.name()+"==="+customAnno.flag());
//检查Emp对象是否有自定义注解(CustomAnno)
boolean annotationPresent = empClass.isAnnotationPresent(CustomAnno.class);
System.out.println(annotationPresent);
//获取Emp上的所有自定义的注解
Annotation[] annotations = empClass.getAnnotations();
System.out.println(Arrays.toString(annotations));
}
}
4、运行结果
还没有评论,来说两句吧...