阿八博客
  • 100000+

    文章

  • 23

    评论

  • 20

    友链

  • 最近新加了很多技术文章,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

注解使用入门(一)

欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/jsh/2019/1010/116397.html

本篇博客要讲解主要分为以下几个问题

注解的相关知识点基于运行时的注解的例子解析说明

至于关于编译时的注解,待下篇博客的时候会结合例子讲解一下,目前我也正在学习当中

注解的相关知识点

提到注解,大多数人应该都不默认,在我们程序中见到的@Override,@Deprected,@SupressWarnings等等,这些都是注解,只不过是系统自己封装好的,而我们平时比较少去深入理解是怎样实现的?

1)什么是注解(Annotation):

Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法
Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据

2)注解的分类:

根据注解参数的个数,我们可以将注解分为三类:

标记注解:一个没有成员定义的Annotation类型被称为标记注解
这种Annotation类型仅使用自身的存在与否来为我们提供信息
比如后面的系统注解@Override;单值注解完整注解 

根据注解使用方法和用途,我们可以将Annotation分为三类:

JDK内置系统注解元注解自定义注解

3)元注解:

元注解的作用就是负责注解其他注解
Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它annotation类型作说明
Java5.0定义的元注解:

@Target,@Retention,@Documented,@Inherited

4)元注解解析说明

@Documented 是否会保存到 Javadoc 文档中@Retention 保留时间,可选值
SOURCE(源码时),CLASS(编译时),RUNTIME(运行时),默认为 CLASS,SOURCE 大都为 Mark Annotation,这类 Annotation 大都用来校验,比如 Override, SuppressWarnings

@Target 可以用来修饰哪些程序元素,如 TYPE, METHOD, CONSTRUCTOR, FIELD, PARAMETER 等,未标注则表示可修饰所有

ANONOTATION_TYPE(注解类型声明),
PACKAGE(包)
TYPE (类,包括enum及接口,注解类型)
METHOD (方法)
CONSTRUCTOR (构造方法)
FIFLD (成员变量)
PARAMATER (参数)
LOCAL_VARIABLE (局部 变量)
@Inherited 是否可以被继承,默认为 false

5)什么是metadata(元数据):

元数据从metadata一词译来,就是“关于数据的数据”的意思

 
 元数据的功能作用有很多,比如:你可能用过Javadoc的注释自动生成文档
这就是元数据功能的一种
总的来说,元数据可以用来创建文档,跟踪代码的依赖性,执行编译时格式检查,代替已有的配置文件
如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:

编写文档:通过代码里标识的元数据生成文档代码分析:通过代码里标识的元数据对代码进行分析编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查

其他知识点暂时不介绍,个人觉得一下子介绍太多概念很难消化
下面让我们一起结合例子来使用它

下面我们来看一下我们要怎样写一个基于编译时的自定义注解的例子

自定义注解大概可分为以下三个步骤:

自定义一个注解在其他类使用我们的注解在运行的时候解析我们的注解

解析运行流程图

解析说明

(1). 通过 @interface 定义,注解名即为自定义注解名,这里注解名为MethodInfo(2). 注解配置参数名为注解类的方法名,且:

a. 所有方法没有方法体,没有参数没有修饰符,实际只允许 public & abstract 修饰符,默认为 public,不允许抛异常

b. 方法返回值只能是基本类型,String, Class, annotation, enumeration 或者是他们的一维数组

c. 若只有一个默认属性,可直接用 value() 函数
一个属性都没有表示该 Annotation 为 Mark Annotation

(3). 可以加 default 表示默认值,如

2)接着我们来看一下我们要怎样使用我们自定义的注解

3)最后我们一起来看一下我们怎样在运行的时候解析我们的Annotation注解

运行时 Annotation 解析

(1) 运行时 Annotation 指 @Retention 为 RUNTIME 的 Annotation,可手动调用下面常用 API 解析

getAnnotations() 则表示得到该 Target 所有 Annotation

测试代码

method = c ; id = 5 ; description = private method; gid= class java.lang.Long
method = b ; id = 4 ; description = protected method; gid= class java.lang.Long
method = a ; id = 3 ; description = public method; gid= class java.lang.Long
constructor = com.xujun.animationdemo.UserAnnotation ; id = 2 ; description = construct; gid= class java.lang.Long

转载请注明原博客地址:

源码下载地址:

相关博客推荐

java Type 详解

java 反射机制详解

注解使用入门(一)

Android 自定义编译时注解1 - 简单的例子

Android 编译时注解 —— 语法详解

带你读懂 ButterKnife 的源码

扫一扫,欢迎关注我的微信公众号 stormjun94(徐公码字), 目前是一名程序员,不仅分享 Android开发相关知识,同时还分享技术人成长历程,包括个人总结,职场经验,面试经验等,希望能让你少走一点弯路

相关文章

暂住......别动,不想说点什么吗?
  • 全部评论(0
    还没有评论,快来抢沙发吧!