Android 自定义注解之运行时注解(RetentionPolicy.RUNTIME)

2023-05-16

RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

获取注解的常用方法:

/** 
 * 获取指定类型的注解 
 */  
public <A extends Annotation> A getAnnotation(Class<A> annotationType);  
  
/** 
 * 获取所有注解,如果有的话 
 */  
public Annotation[] getAnnotations();  
  
/** 
 * 获取所有注解,忽略继承的注解 
 */  
public Annotation[] getDeclaredAnnotations();  
  
/** 
 * 指定注解是否存在该元素上,如果有则返回true,否则false 
 */  
public boolean isAnnotationPresent(Class<? extends Annotation> annotationType);  
  
/** 
 * 获取Method中参数的所有注解 
 */  
public Annotation[][] getParameterAnnotations();  

1. 定义注解

/**
 * @author mazaiting
 * @date 2018/1/16
 */

public class RuntimeAnnotation {
    /**
     * 适用类、接口(包括注解类型)或枚举
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface ClassInfo {
        String value();
    }

    /**
     * 适用变量,也包括枚举常量
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface FieldInfo {
        int[] value();
    }

    /**
     * 适用方法
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface MethodInfo {
        String name() default "long";
        String data();
        int age() default 24;
    }
}

2. 使用注解

/**
 * @author mazaiting
 * @date 2018/1/16
 */
@RuntimeAnnotation.ClassInfo("TestRuntimeAnnotation class")
public class TestRuntimeAnnotation {
    @RuntimeAnnotation.FieldInfo(value = {1, 2})
    public String fieldnfo = "FieldInfo";
    @RuntimeAnnotation.FieldInfo(value = {10086})
    public int i = 100;
    @RuntimeAnnotation.MethodInfo(name = "mazaiting", data = "big")
    public static String getMethodInfo() {
        return TestRuntimeAnnotation.class.getSimpleName();
    }
}

3. 解析注解

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView =  (TextView) findViewById(R.id.textView);
        /**运行时注解*/
        textView.setText(parse());
    }

    /**
     * 解析运行时注解
     */
    private String parse() {
        // 创建一个线程安全的字符串拼接对象
        StringBuffer sb = new StringBuffer();
        // 获取类字节码
        Class cls = TestRuntimeAnnotation.class;
        // 获取构造方法
        Constructor[] constructors = cls.getConstructors();
        // 获取指定类型的注解
        // 获取ClassInfo注解
        sb.append("Class注解:").append("\n");
        RuntimeAnnotation.ClassInfo classInfo =
                (RuntimeAnnotation.ClassInfo) cls.getAnnotation(RuntimeAnnotation.ClassInfo.class);
        if (null != classInfo) {
            // 拼接访问修饰符和类名
            sb.append(Modifier.toString(cls.getModifiers())).append(" ")
                    .append(cls.getSimpleName()).append("\n");
            sb.append("注解值:").append(classInfo.value()).append("\n\n");
        }

        // 获取FieldInfo注解
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            RuntimeAnnotation.FieldInfo fieldInfo = field.getAnnotation(RuntimeAnnotation.FieldInfo.class);
            if (null != fieldInfo) {
                // 拼接访问修饰符,类型名,字段名
                sb.append(Modifier.toString(field.getModifiers())).append(" ")
                        .append(field.getType().getSimpleName()).append(" ")
                        .append(field.getName()).append("\n");
                sb.append("注解值:").append(Arrays.toString(fieldInfo.value())).append("\n\n");
            }
        }

        // 获取MethodInfo注解
        sb.append("Method注解:").append("\n");
        Method[] methods = cls.getDeclaredMethods();
        for (Method method: methods) {
            RuntimeAnnotation.MethodInfo methodInfo = method.getAnnotation(RuntimeAnnotation.MethodInfo.class);
            if (null != methodInfo) {
                // 拼接访问修饰符、返回值类型、方法名
                sb.append(Modifier.toString(method.getModifiers())).append(" ")
                        .append(method.getReturnType().getSimpleName()).append(" ")
                        .append(method.getName()).append("\n");
                // 注解值
                sb.append("注解值:").append("\n");
                sb.append("name: ").append(methodInfo.name()).append("\n");
                sb.append("data: ").append(methodInfo.data()).append("\n");
                sb.append("age: ").append(methodInfo.age()).append("\n");
            }
        }
        return sb.toString();
    }
}

效果图:

效果图.png
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 自定义注解之运行时注解(RetentionPolicy.RUNTIME) 的相关文章

随机推荐

  • OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解

    xff08 一 xff09 Mat矩阵 图像容器 创建时CV 8UC1 CV 8UC2等参数详解 1 Mat不但是一个非常有用的图像容器类 同时也是一个通用的矩阵类 2 创建一个Mat对象的方法很多 我们现在先看一下Mat矩阵 图像容器类在
  • IP地址和MAC地址的作用和相互关系

    IP地址和MAC地址的作用和相互关系 关于IP地址和MAC地址相互关系以及数据包在网络中的寻址过程 xff0c 这两天盘了一下 xff0c 十多年前的计算机网络课程 xff0c 还是没有完全忘记的 概念说明 xff1a MAC地址 xff1
  • git commit –amend命令修改comment

    当git commit m your comment 后 xff0c 想修改提交后的comment xff0c 可以使用git commit amend命令 1 git commit amend xff0c 会出现上一次提交时的commen
  • php 设置允许跨域请求

    php 设置允许跨域请求 跨域 xff0c 指的是浏览器不能执行其他网站的脚本 它是由浏览器的同源策略造成的 xff0c 是浏览器施加的安全限制 同源策略 xff1a 是指域名 xff0c 协议 xff0c 端口均相同 xff0c 有任一不
  • TortoiseGit-git工具

    git小乌龟 git工具 xff0c 贼好用 下载地址 Download TortoiseGit Windows Shell Interface to Git
  • FAST-LIO, ikd-Tree, FAST-LIO2, FASTER-LIO论文总结

    目录 一 FAST LIO 本文的三个创新点 xff1a FAST LIO框架 二 ikd Tree 三 FAST LIO2 四 FASTER LIO 一 FAST LIO FAST LIO三个创新点 xff1a 将IMU和雷达点特征点紧耦
  • Realsense D435i运行ORB-SLAM3

    ORB SLAM3 根目录下的CMakeList txt opencv版本改为3 xff0c 目的是与ROS下的CMakeList txt指定的opencv版本相同 xff0c 都为3 否则会段错误 build sh build ros s
  • VINS-Fusion运行相关

    如何安装VINS Fusion 根据网址安装 xff1a https github com HKUST Aerial Robotics VINS Fusion 先装ceres xff08 网址中的改成 xff1a sudo make ins
  • jetson xavier nx 上 bash: nvcc: command not found

    jetson Xavier nx上已经默认安装好了cuda cuda 10 2和cudnn等 出现这个问题是因为 我们需要把cuda目录下的bin文件添加到环境变量中 解决方案 vim bashrc 按 i 进入输入模式 xff0c 在最后
  • ROS下使用intel Realsense摄像头进行人脸检测

    使用准备条件 xff1a ROS indigo intel Realsense摄像头 xff08 我使用的依旧是R200 xff09 确保已经正常安装驱动 xff0c 安装方法见博文 http blog csdn net may0324 a
  • 【VINS-MONO】RealsenseD435i运行VINS-Mono

    1 查看需要的 camera imu的topic内容格式 xff1a roscore rosbag play lt bag gt rostopic list rostopic echo lt topic gt 2 对齐XJ2 bag中的IM
  • vsCode如何自动保存代码

    文件 勾选自动保存 xff0c 即可
  • 智能设备WIFI配网方式汇总

    当前很多物联网设备大都无没有人机交互界面 xff0c 也就没有像手机或者PC那样有wifi的配置界面 xff0c 汇总了一下设备入网的方式大概有如下几种 xff1a 1 xff1a AP 模式流程如下 1 将Dev手动设置为AP模式 xff
  • 平凡的人生or开挂的人生——对知乎相关问题的回答

    知乎原题 xff1a 为什么有些人的人生和开了挂一样 xff1f https www zhihu com question 37106162 楼上说的都特别好 xff0c 我很想补充一点 我先抛出一个背景概念 我认为开挂人生 xff0c 本
  • Linux内核机制总结中断异常和系统调用之系统调用(三十三)

    文章目录 1 系统调用1 1 定义系统调用1 2 执行系统调用 重要 xff1a 本系列文章内容摘自 lt Linux内核深度解析 gt 基于ARM64架构的Linux4 x内核一书 xff0c 作者余华兵 系列文章主要用于记录Linux内
  • Web前端工程化之VSCode+Git 解决冲突和error

    多人协作开发使用版本控制难免会有冲突 xff0c 在前端使用VSCode和Git过程中 xff0c 就会遇到大大小小的冲突 xff0c 有的merge一下 xff0c 然后提交推送就可解决 xff0c 有的是因为HEAD指针混乱造成 xff
  • 平时积累(四)

    1 重启Android运行环境 xff1a xff08 1 xff09 sudo adb shell stop xff08 2 xff09 sudo adb shell start 2 设置Android系统属性 xff1a xff08 1
  • 速度环+直立环+转向环

    文章目录 直立环直立环调节速度环速度环调节转向环 直立环 车模平衡控制也是通过负反馈来实现的 xff0c 与上面保持木棒直立比较则相对简单 因为车模有两个轮子着地 xff0c 车体只会在轮子滚动的方向上发生倾斜 控制轮子转动 xff0c 抵
  • 六轴传感器+卡尔曼滤波+一阶低通滤波

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 角度与角速度测量1 角度与角速度获取2 互补滤波3卡尔曼滤波4 实现卡尔一阶低通滤波5 实现卡尔曼滤波算法 角度与角速度测量 1
  • Android 自定义注解之运行时注解(RetentionPolicy.RUNTIME)

    RetentionPolicy RUNTIME xff1a 注解不仅被保存到class文件中 xff0c jvm加载class文件之后 xff0c 仍然存在 获取注解的常用方法 xff1a 获取指定类型的注解 public lt A ext