注解

注解

概述

/*
注解 = 注释 + 解释
    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();
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容