注解详解

之前也敲过几次关于注解的代码,但是奈何又忘了,故此写一篇文章来个身体记忆法。

作为很多牛逼的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类,之后在使用的地方进行反射获取就结束了,真真没什么东西,如果这块有什么不懂的,大家还是去补补基础知识吧,毕竟我不是保姆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值