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) 的相关文章

  • 低于 64K 方法时出现“方法超出编译器指令限制”消息

    我经常在日志中看到类似这样的重复消息 Method exceeds compiler instruction limit 29278 in void com xxxxxxapp xxxxxx MyGLRenderer onDrawFrame
  • 在运行时在 FloatingActionButton 上设置layout_anchor

    我正在尝试为固定到我的 AppBarLayout 的 android support design widget FloatingActionButton 制作动画 我可以在布局 xml 中对其进行很好的设置 并且它显示得很好 但是 我正在
  • 如何设置自定义谷歌地图标记的背景图像?

    我有一个用于 Google 标记的自定义图像 但我必须在其背景上设置另一个图像 是否可以设置地图标记的背景图像 是的你可以 试试这个所以问题如何使用 Android 地图 API v2 创建自定义形状的位图标记 https stackove
  • 在 Android Studio 中设置 Http 代理

    我已经阅读了多个类似的问题和文档 但我无法解决我的机器所在的公司防火墙的问题 我收到的错误是 无法刷新 Gradle 项目 未知主机 services gradle org 我所阅读和理解的所有内容都让我相信这是一个 http 代理问题 我
  • 从 Bitmap 类创建 .bmp 图像文件

    我创建了一个使用套接字的应用程序 客户端在其中接收图像并将图像数据存储在 Bitmap 类中 谁能告诉我如何创建一个名为我的图像 png or 我的图像 bmp来自此 Bitmap 对象 String base64Code dataInpu
  • android以编程方式打开电池设置

    我正在寻找一种从 Android 应用程序打开电池设置屏幕的方法 到目前为止我发现了两个意图 Intent ACTION POWER USAGE SUMMARY Settings ACTION BATTERY SAVER SETTINGS
  • 自定义 AlertDialog - android.R.id.custom 的问题

    我确信我错过了这里的重点 所以我希望有人能解释一下 我想在用户触摸时创建一个弹出窗口ImageView 我看了一下AlertDialog文档说 如果您想显示更复杂的视图 请查找名为 custom 的 FrameLayout 并将您的视图添加
  • Gradle 控制台 - 获取更多日志输出

    我正在使用Android Studio 在 gradle 控制台中收到以下错误消息 编译错误 查看日志了解更多详情 尝试 使用 stacktrace 选项运行以获取堆栈跟踪 使用 info 或 debug 选项运行以获得更多日志输出 构建失
  • com.google.firebase.provider.FirebaseInitProvider:java.lang.ClassNotFoundException:com.google.firebase.provider.FirebaseInitProv

    收到此错误KitKat和较低版本完美运行在 Lollipop 及以上版本 我已将所有必需的 jar 包含在 cradle 和 Firebase json 文件中以接收 GCM 我的应用程序梯度 apply plugin com androi
  • Android 4.3 的 Google 地图 Android API V2 问题

    我是谷歌地图的新手 刚刚点击此链接http www androidhive info 2013 08 android working with google maps v2 http www androidhive info 2013 08
  • 当您处于飞行模式并退出飞行模式时,我只收到最后一条 FCM 推送通知?

    我只在退出飞行模式后收到最后的推送通知 FCM 但是 如果我的应用程序位于前台 一旦我离开飞行模式 我将收到所有推送通知 我已将 FCM 消息类型实现为通知消息 笔记 无法将 FCM 消息类型实现为数据消息 因为 APNS 只接受我的 iO
  • TextView位于屏幕中央[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Android 中的 TextView 中水平和垂直居中文本 https stackoverflow com questions 432037 how do i center text hor
  • 如何从 Android L 预览设计制作 Android 列表视图设计

    我制作Android L预览图像样式列表项 这是我针对这些类似设计的代码 可绘制 list item bg xml
  • Firebird 和 Android JDBC 驱动程序

    火鸟有问题 我从未与 DB 合作过 服务器 firebird 1 5 上的数据库 添加库 firebird full 2 2 4到 libs 文件夹 将其添加到 Gradle implementation fileTree libs 将其添
  • SlidingPaneLayout setCoveredFadeColor () 和 setSliderFadeColor()

    我正在使用SlidingPaneLayout并希望在滑块右窗格打开时在左窗格上设置灰色渐变颜色 在右窗格关闭且左窗格完全可见时在左窗格上设置透明渐变颜色 我知道这是默认行为SlidingPaneLayout 但使用默认实现时 我在横向模式下
  • 没有 ContentProvider 的 SyncAdapter

    我想为我想要与服务器同步的内容实现 SyncAdapter 看来要做到这一点 您需要为 SyncAdapter XML 属性文件中指定的权限注册一个 ContentProvider 由于我不希望手机的其余部分可以访问此内容 因此我没有实现自
  • 存储 FCM 的令牌

    我正在尝试将我的令牌存储在我的云数据库中 我稍后将在云函数中使用此令牌 以便向已添加为好友的用户发送通知 然而 推送设备令牌不起作用 因为用户未经授权 授权后我无法保存它 因为令牌是在安装应用程序时生成的 private static fi
  • 水平 RecyclerView 顶部的滚动条

    我正在做简单的演示卧式RecyclerView 我想与回收视图一起显示滚动条 所以我添加了android scrollbars horizontal and android scrollbarSize 5dp 在 XML 中 我可以获得滚动
  • 如何将上下文从一个活动传递到另一个活动?

    我有一个主要活动 它调用另一个活动来显示一些数据 我有一个私有数据库帮助程序对象 我在整个主要活动代码中使用它 有没有办法以优雅的方式将我的主要活动的上下文传递给我的子活动 即 来自子类 类似getCallingActivityContex
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte

随机推荐

  • 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