android 注解详解

news2024/10/2 8:26:27

1,注解的概念

注解现在广泛的应用于android的各个开源框架中,不理解注解,我们就无法更好的提升我们的架构能力。那么什么是注解呢?注解(Annotation),是JDK5.0 引入的一种注释机制。 注解是元数据的一种形式,提供有关于程序但不属于程序本身的数据。注解对它们注解的代码的操作没有直接影响。

2,注解的定义

在java中,所有的注解都默认实现Annotation接口,接口如下:

public interface Annotation {
    boolean equals(Object var1);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}

要定义一个注解,和定义一个接口差不多,只不过在interface前面多了一个@

public @interface YuanZhen{

}

3,元注解

在定义注解时,注解类也能够使用其他的注解声明。对注解类型进行注解的注解类,我们称之为 meta-annotation(元注解)

元注解有四种类型:

@Target指定注解的作用范围
@Retention指定注解的作用时机
@Inherited被该注解修饰的注解,作用在某个类上,该类的此注解可以被子类继承
@Documented给Javadoc配置的
@IntDefandroid新引入的,int类型,代替枚举的使用
@StringDefandroid新引入的,String类型,代替枚举的使用

最常用的是@Target 和@Retention。@Inherited和@Documented 一般很少用到,@IntDef和@StringDef多用来代替枚举,因为枚举的使用会增加内存的消耗。

3.1 @Target

@Target用来指定注解的作用范围,参数如下:

ElementType.ANNOTATION_TYPE
可以应用于注解类型
ElementType.CONSTRUCTOR
可以应用于构造函数
ElementType.FIELD
可以应用于字段或属性
ElementType.LOCAL_VARIABLE
可以应用于局部变量
ElementType.METHOD
可以应用于方法级注解
ElementType.PACKAGE
可以应用于包声明
ElementType.PARAMETER
可以应用于方法的参数
ElementType.TYPE
可以应用于类的任何元素

可以看一下下面的例子:

定义一个作用于方法参数的注解

@Target(ElementType.PARAMETER)//作用于方法的参数
public @interface YuanZhen {
}

当作用于类上时,就会报错,而作用于方法参数上,就可以正常运行

3.2@Retention

此元注解用来指定注解的作用时机,也就是说注解是在什么阶段有效,参数如下:

RetentionPolicy.SOURCE
标记的注解仅保留在源级别中,并被编译器忽略
RetentionPolicy.CLASS
标记的注解在编译时由编译器保留,但 Java 虚拟机 (JVM) 会忽略
RetentionPolicy.RUNTIME
标记的注解由 JVM 保留,因此运行时环境可以使用它

3.2.1RetentionPolicy.SOURCE

源码级别,在编译期能够获取注解与注解声明的类包括类中所有成员信息,一般用于生成额外的辅助类。

这个最常用的技术就是APT技术,好多开源框架都是使用的这种技术,例如:ButterKnife,EventBus,ARout,IOC,ROOM等等,应用非常广泛,APT技术一般是结合JavaPoet使用,这里就不详细介绍了,以后有时间详细讲解

3.2.2RetentionPolicy.CLASS

字节码级别,在编译出Class后,通过修改Class数据以实现修改代码逻辑目的。对于是否需要修改的区分或者修改为不同逻辑的判断可以使用注解。

这个最常用的技术就是字节码插桩,字节码插桩框架主要有三种,ASM,Javassist,AspectJ。

性能方面ASM最优。稳定性和简单性方面AspectJ最优。利用AOP思想,我们可以无侵入的实现埋点,监控方法耗时,UI卡顿监控,自动添加日志,代码隔离等等功能。以后有时间会讲解各个功能的实现方案。

3.2.3 RetentionPolicy.RUNTIME

上面两个都属于编译阶段,RetentionPolicy.RUNTIME属于运行时期,它是在程序运行期间,通过反射技术动态获取注解与其元素,从而完成不同的逻辑判定。

这个最典型的使用案例就是反射,关于反射相信大家都不陌生了。很多老的框架都是使用的反射,比如XUtils等,比较影响性能,所以逐步被APT和JavaPoet技术替代。

3.3@Inherited

该注解的作用是子类可以继承父类的注解,意思就是,如果一个注解添加了@Inherited,例如:

@Inherited
@Target(ElementType.TYPE)
public @interface YuanZhen {
}

那么用该注解修饰的类,其子类可以获取到该注解。

3.4@IntDef 和@StringDef

@IntDef 和@StringDef是安卓引入的新的元注解,这两个注解的主要作用是用来替代枚举的,因为枚举对内存的消耗比较大,下面来看怎么使用:

自定义一个注解:

@Inherited
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.SOURCE)
@IntDef({DataBean.DOCTOR, DataBean.TEACHER})
public @interface YuanZhen {
    
}

数据类:

public class DataBean {

    public static final int DOCTOR = 0;

    public static final int TEACHER = 1;

    private int type;

    public void setType(@YuanZhen int type) {
        this.type = type;
    }

    public int getType() {
        return type;
    }
}

使用时:

@StringDef和@IntDef的用法一样,这里就不再举例了。

4,注解类型元素

注解允许我们在使用时传递参数,可以传递一个参数或者多个参数

当只有一个参数需要传递时,我们可以这样写:

@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface YuanZhen {

    String value() default "111";

}
@YuanZhen("222")
public void testMethod(){
}
//因为有默认值 也可以这样写
@YuanZhen()
public void testMethod(){
}
注意:在使用注解时,如果定义的注解中的类型元素无默认值,则必须进行传值。
当有多个参数时,可以这样写:
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface YuanZhen {

    String value() default "111";
    
    int age();

}
@YuanZhen(value = "222",age = 88)
public void testMethod(){
}

5,总结

关于注解的基本知识就是这些,基本的注解并不难掌握,但是后面想要提高自己的架构能力,就必须结合APT,JavaPoet以及字节码插桩技术和反射,综合运用到框架中去,这并不是一件简单的事情,但是了解之后,我们就会发现一片新的天地。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

印刷企业如何利用MES管理系统改善生产计划

随着科技的发展&#xff0c;印刷MES管理系统正在逐渐改变印刷企业的生产管理模式。印刷MES管理系统是一种用于监控、协调、优化生产流程的系统&#xff0c;它能够提供实时、准确的数据&#xff0c;帮助企业管理者做出更好的生产决策。本文将探讨印刷企业如何利用MES管理系统改善…

SQL sever中表管理

目录 一、创建表&#xff1a; 1.1语法格式&#xff1a; 1.2示例&#xff1a; 二、修改表&#xff1a; 2.1语法格式&#xff1a; 2.2示例&#xff1a; 三、删除表&#xff1a; 3.1语法格式&#xff1a; 3.2示例&#xff1a; 四、查询表&#xff1a; 4.1语法格式&…

C++新特性:智能指针

一 、为什么需要智能指针 智能指针主要解决以下问题&#xff1a; 1&#xff09;内存泄漏&#xff1a;内存手动释放&#xff0c;使用智能指针可以自动释放 2&#xff09;共享所有权指针的传播和释放&#xff0c;比如多线程使用同一个对象时析构问题&#xff0c;例如同样的数据…

台灯应该买什么样的才能护眼?推荐五款安全健康的护眼台灯

台灯主要还是以护眼台灯为主&#xff0c;因为不仅色谱丰富&#xff0c;贴近自然色的全光谱色彩&#xff0c;通常显色指数都能达到Ra95以上&#xff0c;显色能力特别强&#xff0c;而且还具有其他防辐射危害、提高光线舒适度的特性&#xff0c;比如侧发光技术、漫反射技术等大大…

社科院杜兰金融硕士不出国门获国家顶尖金融管理硕士学位及教育部留服中心学历学位认证

社科院杜兰金融硕士不出国门获国家顶尖金融管理硕士学位及教育部留服中心学历学位认证 中国社科院与美国杜兰大学金融管理硕士从默默无闻到人尽皆知&#xff0c;已在中外合作办学硕士领域走出了一条难以被模仿、无法被替代的特质。中国社会科学院与杜兰大学充分代表了中美两国…

JavaSE(一)--Java语法

&#xff01;&#xff01;&#xff01;本文适合有c和c基础的&#xff0c;通过比较c和java的不同&#xff0c;快速入门java。&#xff01;&#xff01;&#xff01; 这篇文章主要是介绍和c不同的地方&#xff0c;没说的知识点按照c写就行了。 零.整体的结构 Java是面向对象的程…

Python 套接字编程完整指南

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 连接设备以交换信息是网络的全部意义所在。套接字是有效网络通信的重要组成部分&#xff0c;因为它们是用于通过本地或全球网络以及同一台计算机上的不同进程在设备之间传输消息的基本概念。它们提供了一个低级接口&am…

Java程序员学vue3最好的方式就是搭建后台管理模板

前言 作为Java程序员&#xff0c;vue3还是有必要学的&#xff0c;毕竟是国内最受欢迎的前端JS框架&#xff0c;你现在接手的项目&#xff0c;前端部分几乎都会和vue沾边&#xff0c;尤其是中小企业。 vue3作为新的大版本&#xff0c;相较于vue2改动还是很多的&#xff0c;目前企…

Kali Linux渗透测试技术介绍【文末送书】

文章目录 写在前面一、什么是Kali Linux二、渗透测试基础概述和方法论三、好书推荐1. 书籍简介2. 读者对象3. 随书资源 写作末尾 写在前面 对于企业网络安全建设工作的质量保障&#xff0c;业界普遍遵循PDCA&#xff08;计划&#xff08;Plan&#xff09;、实施&#xff08;Do…

基于Python开发的玛丽大冒险小游戏(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的玛丽冒险小游戏程序&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xf…

【PCL-11】提取平面上层的目标物,剔除平面下层目标物

因项目需求,需提取平面上的物体,不提取平面下的物体,尝试采用超体聚类+LCCP分割的方式,但由于上层点云模型一侧有空洞,导致分割效果不理想。 这里采用pcl::ExtractPolygonalPrismData类,实现平面上物体的提取。 pcl::ExtractPolygonalPrismData类是通过设定处于同一平面模…

对于html和css初学者,你有什么值得推荐的简单的网页适合练习?

前言 html和css方面个人认为主要是在于css的学习&#xff0c;变化最多的也在于css&#xff0c;下面主要是介绍一些css相关的练习网站及一些项目&#xff0c;希望对你有帮助~ 网站推荐 1、CODEPEN 代码与所展示的页面相互对应&#xff0c;你可以在上面找到其他人已经写好的de…

胖小酱之不龟手之药寓言故事

宋国有个人善于炼制一种预防皮肤冻裂的药膏。在冬天如果把这种药膏涂在手上的话就能够防止手冻裂&#xff0c;所以他家祖祖辈辈就靠冬天的时候&#xff0c;在河边把这些药膏卖给洗衣服的人们来为生。 有个外地人听说他们家善于炼制这种药膏&#xff0c;便寻上门来&#xff0c;情…

同旺科技USB to I2C 适配器烧写 Arduino 模块

所需设备&#xff1a; 内附链接 1、同旺科技USB to I2C 适配器 2、Arduino 模块 硬件连接&#xff1a; 用同旺科技USB to I2C 适配器连接芯片的TX、RX、GND; 打开Arduino IDE编辑工具&#xff0c; 点击“上传”按钮&#xff0c;完成程序的编译和烧录&#xff1b;

RabbtiMQ的安装与在Springboot中的使用!!!

一、安装Erlang与Rabbitmq 安装教程本教程是在centos8下试验的&#xff0c;其实linux系统的都差不多RabbitMQ官方&#xff1a;Messaging that just works — RabbitMQRabbitMQ是开源AMQP实现&#xff0c;服务器端用Erlang语言编写&#xff0c;Python、Ruby、 NET、Java、JMS、c…

使用Python操作MySQL数据库

准备 安装Python,打开命令提示符&#xff0c;我已经安装成功了 安装Mysql我也安装成功了 我在用户的86188下利用记事本写了一个.py的python代码&#xff0c;在命令提示符中运行 Python自带的集成式开发环境,在电脑搜索框直接IDEA你也会打开 一&#xff0c;建立连接 使用Python…

AR眼镜: 与人并行的智能伙伴

AR眼镜&#xff1a; 与人并行的智能伙伴 增强现实&#xff08;Augmented Reality&#xff0c;AR&#xff09;眼镜是一种将虚拟信息与真实世界进行融合的设备&#xff0c;通过眼镜或头戴设备让用户能够看到真实世界&#xff0c;并在其上叠加数字内容和图像。目前工业级AR眼镜已…

python考研志愿填报模拟系统vue

本系统提供给管理员对学生、院校、研究生信息、专业信息、学院信息等诸多功能进行管理。本系统对于学生输入的任何信息都进行了一定的验证&#xff0c;为管理员操作提高了效率&#xff0c;也使其数据安全性得到了保障。本考研志愿填报模拟系统以Django作为框架&#xff0c;B/S模…

2022蓝帽杯半决赛

2022蓝帽杯取证题目解压密码附件 链接&#xff1a;https://pan.baidu.com/s/1AS0wVdjZxt46zaDcDzxdaQ 提取码&#xff1a;scpc –来自百度网盘超级会员V4的分享 解压密码7(G?fu9A8sdgfMsfsdrfE4q6#cf7af0fc1c 参考奇安信攻防社区-第六届“蓝帽杯”半决赛取证题目官方解析 20…

【项目测试报告】博客系统 + 在线聊天室

文章目录 一、项目介绍1.1 核心技术1.2 核心功能1.3 技术亮点1.4 前端页面设计登录页面注册页面博客广场页面搜索结果页面个人博客页面个人中心页面我的关注/粉丝页面聊天室页面写博客页面我的草稿修改博客页面博客详情页他人博客主页 二、功能测试2.1 登录测试用例2.2 注册测试…