Android 注解解析及使用

2023-05-16

目录

一、注解解析。

1.什么是注解?

2.为什么要使用注解?

3.android中常见的注解有哪些?

4.元注解。

二、注解使用。

1.如何实现一个注解?

2.android中注解示例。



一、注解解析。

1.什么是注解?

注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释代码的一部分。注解对于代码的运行效果没有直接影响。

通俗易懂点讲,注解就是一种标签,对类、方法、属性等赋予的一种代码级解释,对代码的运行效果没有丝毫影响。

那么问题来了,既然对代码没有丝毫影响,为什么要用它呢?我们带着问题来进行下面的阅读。

2.为什么要使用注解?

  • 通过注解中的参数值,进行条件判断来处理对应的逻辑。
  • 通过注解可以处理一些有规律性的代码处理,简化代码,比如我们一直重复写的findViewById问题。
  • 通过注解我们可以自动生成一些代码,比如我们用的greendao,这样自动生成,既可以避免错误,又让代码简洁。

下面我们会讲到一些注解的实际使用场景,大家先了解注解的一些概念及方法。

3.android中常见的注解有哪些?

下面我们来讲一下android中常见的注解,带大家先有个基本认识。

@override:当子类重写父类的方法时,用于标识继承自父类的方法。

@deprecate:用于标记一些过时的方法,相信大家都不陌生,比如我们调用一些过时的api,中间会有一条删除线。

@SupressWarnings: 忽略警告。all表示忽略全部警告。

4.元注解。

元注解是用于注解注解的注解。

听起来可能有点拗口,元注解就是在我们定义的注解上添加的注解即为元注解,元注解一共有四个,大家别慌,我们一个一个来看。

1.@Retention

该注解用于标识我们的定义的注解的过期时间。一共有三个值:

RetentionPolicy.SOURCE:源码阶段,就是说我们在代码编写阶段有效。

RetentionPolicy.CLASS:编译阶段,代码编译前有效。

RetentionPolicy.RUNTIME:运行时阶段,代码会一直有效,生命周期很长。

2.@Target

该注解用于标识我们定义的注解的使用场景,比如方法名上,类上等。下面是它可以使用场景的值:                  ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
ElementType.CONSTRUCTOR 可以给构造方法进行注解
ElementType.FIELD 可以给属性进行注解
ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
ElementType.METHOD 可以给方法进行注解
ElementType.PACKAGE 可以给一个包进行注解
ElementType.PARAMETER 可以给一个方法内的参数进行注解
ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举

3.@Documented

文档相关,将注解中的元素包含到 Javadoc 中去。

4.@inherit

如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。

二、注解使用。

1.如何实现一个注解?

我们想自定义一个注解的话,跟接口类似,用关键字@interface。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
    int getAge() default 0; //方法可以设置默认值
}

上面我们一定一个注解为MyAnnotation,定义这个注解我们使用场景为给属性添加并且一直有效。

那么我们接下来使用这个注解,我们定义个user类。

public class User {
    @MyAnnotation(getNum = 20)
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

我们给字段属性age设置了注解,并且值为20;那么我们接下来实现代码获取到这个20.

public static void main(String[] args) throws NoSuchFieldException {
        //获取user类对象
        Class<User> userClass = User.class;
        //获取user类的age属性值
        Field ageField = userClass.getDeclaredField("age");
        //判断该属性值是否包含MyAnnotation注解
        boolean isExit = ageField.isAnnotationPresent(MyAnnotation.class);
        if (isExit){
            //如果包含,获取到注解
            MyAnnotation annotation = ageField.getAnnotation(MyAnnotation.class);
            //获取到注解值
            int num = annotation.getNum();
            System.out.println("num:" + num);
        }
    }

这里需要将几个重要方法:

isAnnotationPresent(Annotation.class):该方法判断是否包含此注解,可以用在类,属性,方法等。

getAnnotation(Annotation.class):该方法获取此注解对象。

那么我们通过上面的例子,基本上是可以使用注解了。下面我们来讲几个android中常用的例子。

2.android中注解示例。

我们android中注解,比如Butterknife,Evenbus,GreenDao等。

我们来自己实现一下Butterknife。

首先定义我们的注解,一共俩个,@BindView、@BindLayout.

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface BindView {
    int value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BindLayout {
    @LayoutRes
    int value();
}

我们定义了俩个注解,通过名字大家也可以看出,一个为绑定view,一个绑定布局xml。

下面我们来实现activity添加注解。

@BindLayout(R.layout.activity_main)
public class MainActivity extends BaseActivity {


    @BindView(value = R.id.tv)
    TextView textView;


    @Override
    void create(){
        textView.setTextColor(Color.parseColor("#ff0000"));
    }
}

也很简单,我们给textview控件添加id注解,并且oncreate初始化时进行文本变色,给activity添加了布局文件xml申明的注解。

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bindLayout();
        bind();
        create();
    }

    abstract void create();

    protected void bind(){
        Class aClass = this.getClass();
        Field[] declaredFields = aClass.getDeclaredFields();
        for (Field field : declaredFields){
            boolean isExit = field.isAnnotationPresent(BindView.class);
            if (isExit){
                BindView annotation = field.getAnnotation(BindView.class);
                int resId = annotation.value();
                try {
                    Method method = aClass.getMethod("findViewById", int.class);
                    method.setAccessible(true);
                    Object invoke = method.invoke(this, resId);
                    field.setAccessible(true);
                    field.set(this,invoke);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    protected void bindLayout(){
        Class aClass = this.getClass();
        BindLayout bindLayout = (BindLayout) aClass.getAnnotation(BindLayout.class);
        if (bindLayout != null){
            int layoutId = bindLayout.value();
            try {
                Method method = aClass.getMethod("setContentView", int.class);
                method.setAccessible(true);
                method.invoke(this, layoutId);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

我们的BaseActivity中做了绑定view跟layout的初始化操作,通过反射来获取到setContentView方法跟findViewById方法进行设置我们的注解值的。代码很全很清晰,如果大家有不清楚的,可以参考我的下一篇,反射篇。

 

如果帮到大家,请大家帮忙点个赞,大家的关注和支持是我坚持下去的动力。

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

Android 注解解析及使用 的相关文章

  • 在android中通过BLE传输图像

    我使用以下代码传输 1 MB 的图像 如果在每个数据包之间实现线程延迟 则图像将成功传输 如果未设置线程延迟 则所有数据包均从BluetoothGattServer 发送 但BluetoothGattCallback 不会接收所有数据包 任
  • Android 上的 SVG 支持

    Android 支持 SVG 吗 有什么例子吗 最完整的答案是这样的 Android 2 x 默认浏览器本身不支持 SVG Android 3 默认浏览器支持 SVG 要将 SVG 支持添加到 2 x 版本的平台 您有两个基本选择 安装功能
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • 安卓定位不准确

    我正在尝试获取当前用户的位置 我试图重构我的代码以获得更好的结果 但我只是不断得到关于准确度的荒谬位置 它在 900 600 米之间 如何才能得到更好的结果 使其精度达到50m以内 这是我的代码 package com agam mapsl
  • Android 如何更改 OnTouchListener 上的按钮背景

    你好 我在 xml 中有一个按钮 我正在使用OnTouchListener在我的活动中获得button按下并释放 但问题是 当我按下按钮时背景颜色没有改变 当我延长可能的活动时OnClickListener背景正在改变 任何人都可以告诉我的
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 调试:在 Android 1.0 中找不到文件

    今天我更新到 Android Studio v 1 0 在尝试编译任何项目时出现以下错误 app build intermediates classes debug 找不到文件 问题是在更新之前我没有任何问题 这是我实际尝试编译的代码 构建
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错
  • Android 服务是否有办法检测设备何时锁定?

    我有一个 Android 服务 我希望在设备锁定时执行操作 我想澄清一下 我对屏幕开 关状态不感兴趣 我知道如何使用带有 Intent ACTION USER PRESENT 和 KeyguardManager inKeyguardRest
  • Android onChange 事件未在 android 5 (Lollipop) 上的 chrome 历史记录的 contentObserver 中触发

    我注意到我的 chrome 历史记录和书签的 contentObservers 在 android lolipop 上不再触发 该代码在旧版本的 android 上完美运行 无论 chrome 版本如何 但在 Lollipop 上它不再运行
  • 如何在TableLayout中创建三列

    我正在开发一个使用的屏幕TableLayout 在这里我可以轻松创建两列 但我怎样才能创建三列呢 这里有一个例子
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 如何在 Viewpager 中禁用预加载下一页? [复制]

    这个问题在这里已经有答案了 如何在 Viewpager 中禁用页面预加载 I tried viewPager setOffscreenPageLimit 0 但它不起作用 用这个viewPager setOffscreenPageLimit
  • 有关 ListView 自定义行布局项目上的 onClick() 事件的帮助

    我有一个 ListView 其行由我格式化 每行都有 ImageView 和 TextView 的混合 我还实现了自己的适配器 并且能够通过它绘制每一行 现在 我想要这样的东西 用户单击 ImageView 不是行上的其他任何位置 但只有此
  • 如何修改 Skobbler 注释而不重新添加它

    我必须修改 SKAnnotation 的图像 注释生成器代码 private SKAnnotation getAnnotationFromView int id int minZoomLvl View view SKAnnotation a
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • Android studio - 如何查找哪个库正在使用危险权限?

    我正在尝试将 apk 上传到 google play 商店 但令我惊讶的是 我正在使用以下权限 Your APK is using permissions that require a privacy policy android perm
  • 在Android Studio gradle项目中使用NDK和STL

    我在将 stlport 链接到 Android Studio 中的 gradle 项目时遇到问题 使用 NDK 的 Eclipse Android 项目迁移到 Android Studio 该项目使用 STL 我有包含内容的 android

随机推荐

  • 随机生成slam 真值和里程计值的 g2o 文件(python实现)

    生成了slam 里程计的真值和里程计的值 并保存顶点和边为 g2o文件 nbsp 随机生成slam 真值和里程计值的 g2o 文 件 gen test data py import numpy as np import matplotlib
  • 滑膜+pid+上层设计下层平均分配 优化分配 动态载荷分配

    滑膜 43 pid 43 上层设计下层平均分配 优化分配 动态载荷分配 xff0c 分布式电动汽车操稳控制 本研究在matlab simulink建立七自由度轮毂电机驱动汽车模型 xff0c 使用滑膜联合控制以及pid控制实现转向过程中质心
  • 12本Python书籍推荐

    Python是用于各种任务和领域的优秀编程语言之一 Python的用户友好性 xff0c 高级特性以及对简单性和增强代码可读性的强调使其成为全球许多开发人员的理想选择 诸如此类的功能使应用程序开发 xff0c 数据科学 xff0c 人工智能
  • Ubuntu 屏幕翻转90度怎么恢复

    笔记本电脑的 ubuntu 屏幕有时候会无意中90度翻转 xff0c 这时候你只能侧着脸看 xff0c 靠鼠标操作想要恢复是极其尴尬的一件事 xff0c 最快捷的方法就用命令是删除 iio sensor proxy 程序 第一步 Ctrl
  • 使用Python+Opencv从摄像头逐帧读取图片保存在本地

    今天测试的时候 xff0c 遇到了一个问题 xff0c 测试需求是 xff0c 需要把摄像头拍摄的实时视频逐帧率保存下来 经过查阅资料以及网友帮助 xff0c 目前已经完成 记录下来希望可以帮助有需要的朋友 1 思路 使用Python 43
  • vscode 运行C++

    本文先介绍了windows下 VSCODE运行C 43 43 前 xff0c 搭建C 43 43 运行环境的必要步骤 后介绍了tasks json launch json的作用 xff0c 并给出了自己使用的配置方案 最后给出了常见问题的解
  • 在执行launch文件时,如果显示不存在这个package

    在执行launch文件时 xff0c 如果显示不存在这个package xff0c 则应注意可能是下述情况导致 xff1a catmake编译完 xff0c 再用rosrun或roslaunch命令找不到package时 xff0c 这时需
  • 迷一样的穿越机飞控电容的作用

    穿越机电源上要并个大电容 xff0c 今天终于碰到一位真神说明白了 xff1a 电容两个作用 xff0c 一个是在你插电的一瞬间 xff0c 因为里面有降压设备大部分都是线圈类的东西 xff0c 产生电磁效应会有高于电池特别高的电压 xff
  • 一、机械小白学单片机之初认识ESP8266

    前言 本人刚接触单片机开发 xff0c 原专业为机械自动化 xff0c 因为传统机械行业的不景气 xff0c 想要转为从事电子行业 之前有一点C语言基础 xff0c 还学过一点点C xff0c 但是也就一点点 可谓小白学习之路 希望能够给大
  • VB.net写一个简易串口RS485调试助手

    最近在调试带rs485串口通讯的设备 xff0c 项目上主要是用PLC和串口通讯 xff0c 因为PLC有集成好的串口块 xff0c 使用起来比较容易 xff0c 为了方便测试 xff0c 就想着用上位机写一个简易的串口通讯程序 xff0c
  • 使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表))

    当你学习了python之后 总想着利用它去做些什么 无论是制作小工具还是小游戏 都是一种锻炼 那么 利用python加上PyQt5写一个简单的音乐播放器 可能会是一个有趣的体验 下面我会分享一下如何编写简易的音乐播放器 其中参考了网络上的很
  • <Python>PyQt5自己编写一个音乐播放器(优化版)

    Python音乐播放器 更新日志 xff1a 20221031 xff1a 添加独立播放列表 20221107 xff1a 添加 上一首 下一首 功能 展示图片 xff1a 202211071308更新 xff1a 添加上一首 下一首功能
  • 以前做的一种特殊的平衡车----三轮球上平衡车

    这个项目做了很长的时间 xff0c 核心算法就是PID xff0c 目标就是让一个三轮车 xff08 轮子为全向轮 xff09 站到足球上并可以进行平移旋转等平面运动 机械部分 使用三个橡胶全向轮 xff0c 通过联轴器连接减速电机 xff
  • VAE与GAN做异常检测的原理

    近几年 xff0c 有大量的人用VAE和GAN来做异常检测 xff0c 用这两个模型做异常检测的假设都是一样的 xff0c 即假定正常数据是服从某一种分布的 xff0c 而异常数据是不能够拟合进这个分布的 xff0c 因此我们可以用VAE和
  • windows10上Eclipse和PyDev搭建python开发环境

    1 安装java环境 xff0c jdk下载地址如下 http www oracle com technetwork java javase downloads index html 完成安装后 xff08 记住安装位置 xff0c 之后有
  • 双系统引导启动切换

    双系统引导启动切换 微软双系统引导启动切换适用环境选择启动盘 微软双系统引导启动切换 适用环境 1 有双系统操作需求 2 强迫症 上期讲了如何重装新的操作系统 xff0c 我有两个盘 xff0c 一个盘固态 xff0c 一个机械 两个里面都
  • gazebo模型不显示

    提示 xff1a File 34 usr lib python2 7 xml etree ElementTree py 34 line 1657 in feed self parser Parse data 0 UnicodeEncodeE
  • 根文件系统(rootfs)的制作

    由于板子不知道什么缘故 xff0c u boot的tftp功能无法应用 xff0c 每次都用串口下载数据 xff0c 但是到后面要下载文件系统的时候实在是太大了 xff0c 完全无法下载 xff0c 因此 xff0c 尝试着做一个简单的文件
  • MPU6050 +STM32F411RCT6

    今天玩了一个MPU6050模块 xff0c 在这里跟大家分享一下 xff0c 希望对大家有所帮助 我用的控制板是我自己画图打板的 xff0c 使用的MCU是STM32F411RCT6 使用的MPU6050如下图 xff0c 在某宝上买的 M
  • Android 注解解析及使用

    目录 一 注解解析 1 什么是注解 xff1f 2 为什么要使用注解 xff1f 3 android中常见的注解有哪些 xff1f 4 元注解 二 注解使用 1 如何实现一个注解 xff1f 2 android中注解示例 一 注解解析 1