【注解】注解解析与应用场景

注解解析与应用场景

1.注解解析
  • 注解解析就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来
2.如何解析注解?
  • 思想:要解析谁上面的注解,就应该先拿到谁(通过反射)
  • 如果要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解
  • 如果要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解
  • Class、Method、Field、Constructor都实现了AnnotatedElement接口,它们都拥有解析注解的能力
AnnotatedElement接口提供了解析注解的方法 说明
public Annotation\[\] getDeclaredAnnotaions() 获取当前对象上面的注释
public T getDeclaredAnnotaion(Class< T > annotationClass) 获取指定的注解对象
public boolean isAnnotationPresent(Class< Annotation > annotationClass) 判断当前对象上是否存在某个注解
java 复制代码
public class MyAnnotationTest{
    @Test
    public void parseMethod() throws Exception { //解析方法上的注解
        //获取Class对象
        Class clazz = Demo.class;
        //获取Method对象
        Method method = clazz.getDeclaredMethod("test");
        //判断Method对象上是否包含MyAnnotation注解
        if(method.isAnnotationPresent(MyAnnotation.class)){
            //获取指定的注解对象
            MyAnnotation myAnnotation = (MyAnnotation) method.getDeclaredAnnotation(MyAnnotation.class);
            //强转后打印信息
            System.out.println(myAnnotation.value()); //李四
            System.out.println(myAnnotation.age()); //28
            System.out.println(myAnnotation.address()); //北京
        }
    }

    @Test
    public void parseClass(){ //解析类上的注解
        //获取Class对象
        Class clazz = Demo.class;
        //判断Class对象上是否包含MyAnnotation注解
        if(clazz.isAnnotationPresent(MyAnnotation.class)){
            //获取指定的注解对象
            MyAnnotation myAnnotation = (MyAnnotation) clazz.getDeclaredAnnotation(MyAnnotation.class);
            //强转后打印信息
            System.out.println(myAnnotation.value()); //张三
            System.out.println(myAnnotation.age()); //20
            System.out.println(myAnnotation.address()); //西安
        }
    }
}

/*
    定义Demo类,并使用定义注解MyAnnotation修饰(属性值自拟)
 */
@MyAnnotation(value = "张三", age = 20, address = "西安")
class Demo {
    //Demo类中定义test方法,并使用定义注解MyAnnotation修饰(属性值自拟)
    @MyAnnotation(value = "李四", age = 28, address = "北京")
    public void test(){

    }
}

@Target({ElementType.TYPE, ElementType.METHOD}) //类和成员方法上
@Retention(RetentionPolicy.RUNTIME) //保留到运行阶段
@interface MyAnnotation {
    String value();
    int age() default 18;
    String address();
}
3.应用场景

模拟Junit程序(提供main方法),运行后能自动触发加了@MyTest注解的所有方法

需求:定义若干个方法,只要加了MyTest注解,就会触发该方法执行

分析

  • 定义一个自定义注解MyTest,只能标注在方法上,存活范围一直都在
  • 定义若干个方法,部分方法加上@MyTest注解修饰,部分方法不加
  • 模拟一个Junit程序,可以触发加了@MyTest注解的方法执行
java 复制代码
public class Demo {
    public static void main(String[] args) throws Exception {
        //获取Demo类的Class对象
        Class clazz = Demo.class;
        //获取所有Method对象
        Method[] methods = clazz.getDeclaredMethods();
        //遍历获取每一个Method对象
        for (Method method : methods) {
            //方法上如果声明了@MyTest注解
            if (method.isAnnotationPresent(MyTest.class)) {
                //运行该方法,参数是空参构造创建的对象
                method.invoke(clazz.getConstructor().newInstance());
            }
        }
    }

    //2、定义若干个方法,在想执行的方法上声明@MyTest注解
    public void test1() {
        System.out.println("test1执行了...");
    }

    @MyTest
    public void test2() {
        System.out.println("test2执行了...");
    }

    public void test3() {
        System.out.println("test3执行了...");
    }

    @MyTest
    public void test4() {
        System.out.println("test4执行了...");
    }
}

//1、自定义注解@MyTest,只能注解方法,存活范围直到RUNTIME
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyTest {

}
相关推荐
DBA小马哥6 分钟前
向量数据库入门到进阶:Embedding、ANN算法与RAG落地的关键术语
数据库·算法·embedding
云和数据.ChenGuang9 分钟前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
祈禾14 分钟前
Redis三大特殊数据类型
运维·服务器·数据库·redis·笔记·缓存
东方护航数据恢复(深圳)25 分钟前
MySQL_Oracle数据库崩溃修复全攻略_东方护航数据恢复深圳店
数据库·mysql·oracle
小龙报1 小时前
【优选算法】1.搜索插入位置 2.x的平方根
java·c语言·数据结构·c++·python·算法·蓝桥杯
y = xⁿ1 小时前
一文掌握Redis常见八股
数据库·redis·缓存
山荷枝1 小时前
04-框架--SpringBoot
java·spring boot·后端
linux修理工1 小时前
内存占用 99% 且 Java 程序较多的优化建议
java·开发语言
Cloud云卷云舒1 小时前
HaishanDB(海山)|磐维数据库|YashanDB(崖山)深度对比分析
数据库·人工智能·海山数据库·haishandb·移动云海山数据库
weixin_460443561 小时前
企业考试系统如何对接OA、钉钉和企业微信?SSO单点登录、组织同步与权限一致性设计
java·开发语言·数据库