文章插图
为什么要学注解
- 要想看懂很多开源库,如Arouter, dagger,Butter Knife等,不得不先看懂注解;
- 想更好地提升开发效率和代码质量,注解可以帮上很大的忙;
一、什么是注解JAVA.lang.annotation,接口 Annotation,在JDK5.0及以后版本引入 。
注解是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理 。通过使用Annotation,开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息 。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证、处理或者进行部署 。
在运行时读取需要使用Java反射机制进行处理 。Annotation不能运行,它只有成员变量,没有方法 。Annotation跟public、final等修饰符的地位一样,都是程序元素的一部分,Annotation不能作为一个程序元素使用 。
【Android注解--初探】其实大家都是用过注解的,只是可能没有过深入了解它的原理和作用,比如肯定见过@Override,@Deprecated等 。
1、注解的作用
注解将一些本来重复性的工作,变成程序自动完成,简化和自动化该过程 。比如用于生成Java doc,比如编译时进行格式检查,比如自动生成代码等,用于提升软件的质量和提高软件的生产效率 。
2、注解都有哪些
平时我们使用的注解有来自JDK里包含的,也有Android SDK里包含的,也可以自定义 。
2.1、JDK定义的元注解
Java提供了四种元注解,专门负责新注解的创建工作,即注解其他注解 。
@target 定义了Annotation所修饰的对象范围
ElementType.CONSTRUCTOR:用于描述构造器@retention 定义了该Annotation被保留的时间长短,取值
ElementType.FIELD:用于描述域
ElementType.LOCAL_VARIABLE:用于描述局部变量
ElementType.METHOD:用于描述方法
ElementType.PACKAGE:用于描述包
ElementType.PARAMETER:用于描述参数
ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
- RetentionPoicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;用于做一些检查性的操作,比如 @Override 和 @SuppressWarnings
- RetentionPoicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;用于在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife)
- RetentionPoicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;用于在运行时去动态获取注解信息 。
@inherited 标记注解,允许子类继承父类的注解 。这里一开始有点理解不了,需要断句一下,允许子类继承父类的注解 。示例:
Target(value = https://www.isolves.com/it/cxkf/ydd/Android/2019-09-02/ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface Sample {public String name() default ""; }@Sample class Test{ } class Test2 extents Test{ } 这样类Test2其实也有注解@sample。
2.2 JDK内置的其他注解
Android 开发中经常使用各种资源常量 R.XXX 来引用各种资源 。例如 图片资源和字符串资源 。这些常量都是 int 类型的,在代码检测的时候没法判断引用的资源是否有错误,比如本来需要一个字符串资源,结果在代码写的时候用了一个颜色资源,这种情况只有通过测试才能发现,有些极端情况可能测试也不容易发现 。资源类型注解就是为了解决该问题的,资源注解包含如下几种:
资源类型注解
@AnimatorRes 表明该参数、变量或者函数返回值应该是一个 Animator 类型的资源
@AnimRes 表明该参数、变量或者函数返回值应该是一个 Anim 类型的资源
@AnyRes 表明该参数、变量或者函数返回值应该是一个任意类型的资源
@ArrayRes 表明该参数、变量或者函数返回值应该是一个 Array 类型的资源
@AttrRes 表明该参数、变量或者函数返回值应该是一个 attribute 类型的资源
@BoolRes 表明该参数、变量或者函数返回值应该是一个布尔类型的资源
@ColorInt 表明该参数、变量或者函数返回值应该是一个颜色值而不是颜色资源引用,例如应该是一个 AARRGGBB 的整数值 。
推荐阅读
- 关于Android系统启动,你需要知道这些步骤
- 有彩蛋 手机远程控制手机,iOS、Android 互连
- 不得不装的21款,Android Studio插件
- 利用 Android Keystore系统 加密存储和解密敏感信息
- JAVA的反射和注解
- 彻底清理手机存储空间的方法
- 一款针对Android设备的高效缓存和垃圾清理工具
- Android开发必备的“80”个开源库,分类整理
- 手把手教你将数据从Android移动到iPhone步骤与技巧
- Android系统从第一代到现在的第十一代,都带来了哪些变化