之前也敲过几次关于注解的代码,但是奈何又忘了,故此写一篇文章来个身体记忆法。
作为很多牛逼的AOP框架的重要组成部分,注解被应用的已经不要再多了,现流行的DataBinding,dagger2,EventBus全是AOP理念下的产物,笔者从接触AOP理念到现在已经有了2年的时间,记得第一次是刚毕业在一个牛逼的全栈工程师手下讨生活,当时读书之余问了大牛一句,现在学什么好啊,大牛直接就给我了一个AOP的学习档案,对于当时刚毕业的笔者,这不得不说是鸭梨山大啊。扯偏了,现在咱们扯回正题,先来谈谈什么是注解。
注解在Java中是体现在java.lang.annotation类,接口Annotation,是Java 1.5版本开始引入的。
注解是代码里特殊的标记,这些标记可以在编译、类加载、运行时被读取,并执行响应处理。通过使用Annotation,开发人员可以不再改变原有代码逻辑的情况下,在原文件中嵌入一些补充信息或者添加部分功能。代码分析工具、开发工具和部署工具可以通过这些补充进行验证、处理和进行部署。
PS:Annotation不能运行,只是成员变量,没有方法
注解家族:
老大,元注解
Java提供4种元注解,专门负责创建新的注解。
- @Target定义了Annotation所修饰的对象范围,取值:
- ElementType.CONSTRUCTOR:用于描述构造器
- ElementType.FIELD:用于描述类变量
- ElementType.LOCAL_VARIABLE:用于描述局部变量
- ElemetType.METHOD:用于描述方法
- ElementType.PACKAGE:用于描述包
- ElementType.PARAMETER:用于描述参数
- ElementType.TYPE:用于描述类、接口(包括注解类)或enum声明
- ElementType.ANNOTATION_TYPE:用于描述注解类型
- ElementType.TYPE_PARAMETER:类型参数声明,1.8开始加入
- ElementType.TYPE_USE:类型使用声明,1.8开始加入
- Retention定义了该Annotation被保留的时间长短,取值:
- RetentionPoicy.SOURECE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;用于做一些检查性的操作,比如@Override和@SuppressWarnings
- RetentionPoicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;用于在编译时进行一些预处理操作,比如生成一些辅助代码(如dataBinding)
- RetentionPoicy.RUNTIME:注解不仅被保留到class文件中,jvm加载class之后,任然存在;用于在运行时去动态获取注解信息
- @Documented:标记注解,用于描述其他类型的注解应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化,不用赋值。
- @Inherited 标记注解,允许子类继承父类的注解
亲儿子:JDK中的注解
常见的两种注解:@Override、@Deprecated
Android SDK中的注解
比较多,所以分类展示:
- 资源引用限制类:用于限制参数必须为对应的资源类型@AnimRes @AnyRes @ArrayRes @AttrRes @BoolRes @ColorRes等
- 线程执行限制类:用于限制方法或者类必须在指定的线程执行@AnyThread @BinderThread @MainThread @UiThread @WorkerThread
- 参数为空性限制类:用于限制参数是否可以为空 @NonNull @Nullable
- 类型范围限制类:用于限制标注值的值范围 @FloatRang @IntRange
- 类型定义类:用于限制定义的注解的取值集合@IntDef @StringDef
- 其他功能性注解:@CallSuper @CheckResult @ColorInt @Dimension @Keep @Px @RequiresApi @RequiresPermission @RestrictTo @Size @VisibleForTesting
干儿子:DataBinding、EventBus、Dagger等
注解信息的获取,需要使用反射获取,反射是一种比较耗时的操作,因此很多第三方的库,选择在编译的时候处理这些信息从而不影响程序的运行加载速度。
自定义注解:简单注解的使用
这个东西说实话没什么可记的,也没什么可说的,只是自定义一个Annotation类,之后在使用的地方进行反射获取就结束了,真真没什么东西,如果这块有什么不懂的,大家还是去补补基础知识吧,毕竟我不是保姆