尊重他人的劳动成果,转载请标明出处:http://blog.csdn.net/gengqiquan/article/details/70184450, 本文出自:【gengqiquan的博客】

今日无事,应狒狒之邀,写一篇详细的关于注解的文章。

注解一般有如下几种作用

  • 生成文档,这是大家最常见的也是Java最早提供的注解功能。比如看源码的时候方法注释上面的 @see @param @return 等等;
  • 减少配置,可以进行运行时动态处理,得到注解信息,实现代替配置文件的功能;也可以通过插件进行编译时处理,以解决解析注解而导致的反射性能消耗;
  • 减少重复工作,比如第三方框架ButterKnife等,通过注解@BindView减少对findViewById的调用;
  • 限定作用域,例如在编译时进行格式检查,如@override 放在方法前,如果你这个同名方法并不是覆盖了超类方法,则编译时就能检查出,用注解替代枚举等等;安卓也提供了一些参数注解来限定资源参数的传入,后面我们会讲到;

注解的优点:方便,简洁,配置信息和 Java 代码放在一起,有助于增强程序的内聚性。

注解的缺点:分散到各个class文件中,所以很不方便维护,比如一些路由注解,打在activity上,尤其是支持多路径的时候,找个错能让你疯。

总体来说注解对于编码带来的好处要多于坏处的,尤其是在是恰当的使用的时候,完全可以减少或者避免他所带来的缺点的。

了解了上面这些之后我们就来看看怎么用好注解这个利器吧。

内容可能比较多,视情况分篇写。免得您看的头疼眼花从了解到放弃。

Android大部分用的Java,我们只谈Java注解和怎么自定义适合自己的注解

元注解

Java语言提供几种基本的元注解,了解并掌握它们之后我们才可以做到得心应手的自定义自己需要的注解。

Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。

  • @Target
  • @Retention
  • @Documented
  • @Inherited

@Target指定了注解对象使用范围,也就是限制了被@Target修饰的注解的可以放在什么地方上面,可以修饰:packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)

@Target取值(ElementType)有:

  • CONSTRUCTOR:用于描述构造器
  • FIELD:用于描述域
  • LOCAL_VARIABLE:用于描述局部变量
  • METHOD:用于描述方法
  • PACKAGE:用于描述包
  • PARAMETER:用于描述参数
  • TYPE:用于描述类、接口(包括注解类型) 或enum声明

比如我们见到最多的系统方法注解@Override

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}

就通过@Target指定了该注解只作用于method,也就是类方法。

@Retention指定了注解对象作用的生命周期,比如有些注解是在编码阶段进行合法化检查的,只需要在源码里保留就行。无需编译进dex文件中。再比如有些注解是需要运行时通过反射获取的,就需要一直保留着。

@Retention取值(RetentionPoicy)有:

  • SOURCE:在源文件中有效
  • CLASS:在class文件中有效
  • RUNTIME:在运行时有效

我们上面的@Override例子里的@Retention(RetentionPolicy.SOURCE)就是表示@Retention(RetentionPolicy.SOURCE)注解只在源码阶段有效。

@Documented是一个标记注解,它代表着此注解会被javadoc等文档生成工具提取到文档内。在doc文档中的内容会因为此注解的信息内容不同而不同。@Documented没有属性成员。

@Inherited也是一个标记注解,它声明了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的注解类型被作用于一个class,则这个注解将被作用于该class的所有子类。

需要注意的是@Inherited注解只会被标注过的class的子类所继承。类并不会从它所实现的接口继承该注解,方法也不会从它所重载的方法继承该注解。

而且当@Inherited标注的注解的Retention属性值是RetentionPolicy.RUNTIME时,反射API会增强这种继承性。也就是说当我们使用java.lang.reflect去查询一个标注了被@Inherited修饰的注解所标注时,反射代码会去检查类和其父类,直到指定的注解类型被发现,或者到达类继承结构的顶层。

以上就是Java提供的元注解的介绍了,接下来我们看自定义注解

自定义注解

@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、类、String、enum)。可以通过default来声明参数的默认值。
使用@interface自定义注解时,会自动继承java.lang.annotation.Annotation接口,编译程序会自动完成其他细节。
定义注解时,不能继承其他的注解或接口。

自定义注解格式为

  public @interface 注解名 {定义体}

注解的参数只支持以下数据类型

  • 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
  • String类型
  • Class类型
  • enum类型
  • Annotation类型
  • 以上所有类型的数组

需要注意的点

  • 注解的参数只能用public或默认(default)这两个访问修饰符
  • 如果只有一个参数成员,最好把参数名称设为value后加小括号
  • 注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在(这段话抄的)

例:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BindView {int value() default -1;
}

以上就是自定义注解的要点了。

下一篇:Android提供的常用注解以及自定义限制作用注解
下下一篇:怎么定义以及代码解析运行时注解

有什么建议的可以留言喔

如果我的博客对您有帮助,请留言鼓励下或者点个赞吧!

我建了一个QQ群(群号:121606151),用于大家讨论交流Android技术问题,有兴趣的可以加下,大家一起进步。

Java 注解那些事儿相关推荐

  1. Java注解---通俗易懂

    本文转载于Java注解-最通俗易懂的注解 Annotation 中文译过来就是注解.标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解. 我个人认为,比较糟糕的技术文 ...

  2. java 注解继承注解_Java注解合并,注解继承

    spring中有时候一个类上面标记很多注解. 实际上Java注解可以进行继承(也就是把多个注解合并成1个) 比如说SpringMVC的注解 @RestController @RequestMappin ...

  3. (原创)JAVA注解应用——实现属性的自动检测

    一.什么是注解 Annotation(注解)是JDK5.0及以后版本引入的新特性.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以'@注解名'在代码中存在的,根据注解参数的个数 ...

  4. 干掉前端!3分钟纯 Java 注解搭个管理系统,我直接好家伙

    最近接触到个新项目,发现它用了一个比较有意思的框架,可以说实现了我刚入行时候的梦想,所以这里马不停蹄的和大家分享下. 我刚开始工作接触的项目都还没做前后端分离,经常需要后端来维护页面,有时候觉得自己好 ...

  5. 学长告诉你 java注解——深入浅出

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制. Java 语言中的类.方法.变量.参数和包等都可以被标注.和 Javadoc 不同,Java 标注可 ...

  6. Java注解基本原理

    Java注解基本原理 注解目前非常的流行,很多主流框架都支持注解,而且自己编写代码的时候也会尽量的去用注解,一时方便,而是代码更加简洁. 注解的语法比较简单,除了@符号的使用之外,它基本与Java固有 ...

  7. 【Java注解】注解基础

    笔记来源:IMOOC Java注解 注解的分类 按照运行机制分 源码注解:注解只在源码中存在,编译成 .class 文件就不存在了 编译时注解:注解在源码和 .class 文件中都存在 运行时注解:在 ...

  8. Java深度历险:Java注解

    2019独角兽企业重金招聘Python工程师标准>>>     在开发Java程序,尤其是Java EE应用的时候,总是免不了与各种配置文件打交道.以Java EE中典型的S(pri ...

  9. 你真的会用java注解吗?

    "揭开java注解的神秘面纱" 介绍 想必大家在接触java,甚至部分工作几年的,对于类.方法.字段上的 @xxx 都有一种迷茫:这是啥玩意,它是怎么运行起来的? 别慌,这就是ja ...

最新文章

  1. SharePonit 2010 更改另存为列表模板的语言类型
  2. python平均成绩计算异常处理_7-10 jmu-python-异常-学生成绩处理基本版 (15 分)
  3. Qt C++属性类型提供给 QML调用(三)
  4. antd 获取table选中行数据_Excel数据匹配:函数法+PQ法+PB法
  5. python和office_Python在office开发中的应用
  6. mysql 8核16g参数优化_问个 MySql 优化问题, 16G, 8 核服务器??
  7. 实时计算pv/uv Demo
  8. Linux网络协议栈(一)——Socket入门(1)
  9. 给程序员的10条建议,句句经典
  10. 系统架构师学习笔记-分布式系统
  11. 还没用上 JDK 11,12 就要来了
  12. php 制作日记本,photoshop制作精美日记本
  13. 互联网晚报 | 9/28星期三 | 微信退群可选保留聊天记录 ;iPhone 14 Pro被吐槽信号差;​贾跃亭率获1亿美元融资...
  14. VBA实现EXCEL随机本地随机刷题
  15. android换肤的实现方案,Android换肤技术总结
  16. matlab教程黄金分割,Matlab程序设计在黄金分割法教学中的应用
  17. 如何登录到你的 WordPress 管理仪表板
  18. ImportError: sys.meta_path is None, Python is likely shutting down 解决方案
  19. 在GT4 Client端EndpointReferenceType的标准序列化方法
  20. 1173 Problem V 《C语言程序设计》江宝钏主编-习题6-2-排列数

热门文章

  1. CSS3高斯模糊特效
  2. SharePoint 2013 入门教程之入门手册
  3. MacOS高性能模式,16寸 M1 Max Macbook Pro独享
  4. 关于佳能IR2320N网络打印机的安装域使用
  5. MySQL 中 is null 和 =null 的区别
  6. seo入门需要掌握的5个SEO基础知识
  7. postgresql 分词_使用Postgresql进行中文分词
  8. 低价引流如何实现高回报
  9. 解除网页不能复制粘贴的限制,百度文库通用
  10. C语言的HelloWorld