注解
概述
/*
注解 = 注释 + 解释
1. 给当前程序开发者提供必要的信息和标记
2. 给Java 编译或者JVM 提供必要数据支持和标记
目前解除的注解
【标记】
@Override
@FunctionalInterface
@Test
【数据支持】
@WebServlet(...)
@RequestMapping(...) Spring MVC
。。。
*/
注解的基本格式
自定义注解格式:
常用元注解(定义 自定义注解的注解)
@Documented // 表明注解参与Javadoc操作,可以生成对应的【Javadoc 文档】
@Retention(RetentionPolicy.SOURCE) // 表明注解参与的阶段:SOURCE 表示注解可以参与代码编译阶段, // 存在于源码中,在class文件中不存在,不会加载到程序运行阶段。
// 默认使用 Class 表示 注解可以存在于字节码文件中,但不会参加程序运行。
// RUNTIME 参与生成字节码文件,,在字节码文件中存在,并且在程序运行中存在,可以利用【反射】获取相应的注解信息。
@Target(value = {...}) // annotationType 见下方表格
@Inherited // 表示当前注解是否会修饰的类或方法,被期子类继承注解。
public @interface MyAnnotation1 {
}
@Target表格,通过枚举ElementType来决定当前注解可以使用范围,一个注解可以用于多种类型之上:
ElementType | 功能概述 |
---|---|
ElementType.TYPE | 表示当前注解可以用于类和接口,以及枚举 |
ElementType.FIELD | 表示当前注解可以用于成员变量 |
ElementType.METHOD | 表示当前注解可以用于成员方法 |
ElementType.PARAMETER | 表示当前注解可以用于成员方法参数 @NotNull |
ElementType.CONSTRUCTOR | 表示当前注解可以用于构造方法 |
ElementType.ANNOTATION_TYPE | 表示当前注解可以用于注解 |
ElementType.LOCAL_VARIABLE | 表示当前注解可以用于局部变量 |
ElementType.PACKAGE | 表示当前注解可以用于包 |
自定义注解中的属性Filed:
注解属性:
以方法之式,行变量之实,实则为方法。
注解属性允许的类型:
基本数据类型,String,注解,枚举,以上类型的数组
自定义注解演示属性操作
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
int value() default 10;
String name() default ""; // 设置default默认值,使用注解时可以不初始化,自动使用默认值。
int age(); // 可以不设置default,但是使用注解时必须初始化。
}
@MyAnnotation (value = 10, name = "wzh", age = 10)
// 或者
@MyAnnotaion (10, name = "wzh", age = 10)
class Demo{
}
/*
【注意】
如果在使用注解时,在其中不表明为那个属性赋值,默认是对VALUE属性赋值,如果自定义注解中没有定义VALUE属性,不表明赋值,则报错。所以一般在自定义时都定义value属性。
*/
利用反射 获取 注解相关内容 【重点】
Class<Demo> cls = Demo.class;
/*
Annotation getAnnotation(Class<A> annotationClass);
通过Class对象获取指定注解类型的注解对象。
*/
MyAnnotation annotation = cls.getAnnotation(MyAnnotation.class);
// 获取属性
annotation.value();
annotation.name();
annotation.age();
标签:10,自定义,当前,注解,ElementType,属性
From: https://www.cnblogs.com/oneblogs/p/17208786.html