通过反射操作注解

Posted 小郑要做干饭人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过反射操作注解相关的知识,希望对你有一定的参考价值。

package com.zzx.反射;

import java.lang.annotation.*;
import java.lang.reflect.Field;

/**
 * @date: 2022/08/08/ 23:31
 * @author: ZhengZiXuan
 * @title: 通过反射操作注解
 * @focus:
 *  Annotation: Annotation是从Jdk5.0开始引入的新技术
 *  作用:
 *      1.不是程序本身,可以对程序作出解释(和注释(comment)没什么区别)
 *      2.可以被其他程序(例如:编译器)获取
 *  格式:
 *      1.注解是以"@注释名"在代码中存在的,还可以添加一些参数值,例如@SupperessWarnings(value ="unchecked")
 *  使用场景:
 *      可以附加在package,class,method,filed上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现
 *   对这些元数据的访问
 */
public class Test01 
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException 
        Class c = Class.forName("com.zzx.反射.Teacher");
        //t通过反射获得注解
        Annotation[] annotations = c.getAnnotations();
        for (Annotation annotation : annotations) 
            System.out.println(annotation);
        

        //获得注解的value的值
        ZhengZiXuan zhengZiXuan = (ZhengZiXuan)c.getAnnotation(ZhengZiXuan.class);
        String value = zhengZiXuan.value();
        System.out.println(value);

        //获得类指定的注解
        Field name = c.getDeclaredField("name");
        FiledZheng annotation = name.getAnnotation(FiledZheng.class);
        System.out.println(annotation.columnName());
        System.out.println(annotation.type());
        System.out.println(annotation.let());
    





/**
 * 1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
 * 2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
 * 3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
 */
@ZhengZiXuan("db_teacher")
class Teacher
    @FiledZheng(columnName = "db_id",type = "int",let = 10)
    private String id;

    @FiledZheng(columnName = "name",type = "varchar" , let = 10)
    private String name;

    @FiledZheng(columnName = "age",type = "int" , let = 5)
    private String age;

    public String getId() 
        return id;
    

    public void setId(String id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getAge() 
        return age;
    

    public void setAge(String age) 
        this.age = age;
    

    @Override
    public String toString() 
        return "Teacher" +
                "id='" + id + '\\'' +
                ", name='" + name + '\\'' +
                ", age='" + age + '\\'' +
                '';
    



//类名的注解
@Target(ElementType.TYPE)//级别:类
@Retention(RetentionPolicy.RUNTIME)
@interface ZhengZiXuan
    String value();




//属性的注解
@Target(ElementType.FIELD)//级别:属性
@Retention(RetentionPolicy.RUNTIME)
@interface FiledZheng
    String columnName();
    String type();
    int let();


运行结果如下:

以上是关于通过反射操作注解的主要内容,如果未能解决你的问题,请参考以下文章

注解与反射

注解与反射

反射动态操作类+注解灵活打标签 | 反射注解结合灵活高效实战

反射和注解

IOC 控制反转Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )

注解和反射反射获取泛型反射获取注解