字号:大 中 小
Annotation在java的世界正铺天盖地展开,有空写这一篇简单的annotations的文章,算是关于Annotation入门的文章吧,希望能各位们能抛砖,共同学习......
不讲废话了,实践才是硬道理.
第一部分:了解一下java1.5起默认的三个annotation类型:
一个是@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的。
一个是@Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
一个是@SuppressWarnings:这一个类型可以来暂时把一些警告信息消息关闭.
如果不清楚上面三个类型的具体用法,各位可以baidu或google一下的,很简单的。
第二部分:讲一下annotation的概念,再来讲一下怎样设计自己的annotation.
首先在jdk自带的java.lang.annotation包里,打开如下几个源文件:
1、源文件Target.java
代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
其中的@interface是一个关键字,在设计annotations的时候必须把一个类型定义为@interface,而不能用class或interface关键字(会不会觉得sun有点吝啬,偏偏搞得与interface这么像).
2、源文件Retention.java
代码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
看到这里,大家可能都模糊了,都不知道在说什么,别急,往下看一下.
在上面的文件都用到了RetentionPolicy,ElementType这两个字段,你可能就会猜到这是两个java文件.的确,这两个文件的源代码如下:
3、源文件RetentionPolicy.java
代码
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
这是一个enum类型,共有三个值,分别是SOURCE,CLASS 和 RUNTIME.
SOURCE代表的是这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面。
ClASS的意思是这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这一些信息加载到虚拟机(JVM)中去.注意一下,当你没有设定一个Annotation类型的Retention值时,系统默认值是CLASS.
第三个,是RUNTIME,表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的.
举一个例子,如@Override里面的Retention设为SOURCE,编译成功了就不要这一些检查的信息;相反,@Deprecated里面的Retention设为RUNTIME,表示除了在编译时会警告我们使用了哪个被Deprecated的方法,在执行的时候也可以查出该方法是否被Deprecated.
4、源文件ElementType.java
代码
public enum ElementType {
TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,
LOCAL_VARIABLE, ANNOTATION_TYPE,PACKAGE
}
@Target里面的ElementType是用来指定Annotation类型可以用在哪一些元素上的.说明一下:TYPE(类型), FIELD(属性), METHOD(方法), PARAMETER(参数), CONSTRUCTOR(构造函数),LOCAL_VARIABLE(局部变量), ANNOTATION_TYPE,PACKAGE(包),其中的TYPE(类型)是指可以用在Class,Interface,Enum和Annotation类型上.
另外,从1的源代码可以看出,@Target自己也用了自己来声明自己,只能用在ANNOTATION_TYPE之上.
如果一个Annotation类型没有指明@Target使用在哪些元素上,那么它可以使用在任何元素之上,这里的元素指的是上面的八种类型.
举几个正确的例子:
@Target(ElementType.METHOD)
@Target(value=ElementType.METHOD)
@Target(ElementType.METHOD,ElementType.CONSTRUCTOR)
具体参考一下javadoc文档
上面一下1和2的源文件,它们都使用了@Documented,@Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息.
另外一点,如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个Annotation类型.
分享到:
相关推荐
Java实战篇:设计自己的Annotation.pdf
实战篇:设计自己的Annotation
全书分为23章,包括需要重点掌握的环境搭建、简单Java程序、Java基础程序设计、数组与方法、面向对象程序设计(基础篇和高级篇)、异常的捕获及处理、包及访问控制权限、Java常用类库、JavaIO、Java类集、Java数据库...
目录 一 注解的定义 二 如何自定义注解 三 元注解 3.1 @Retention 3.2 @Target 3.3 @Documented ...七 注解实战之简易测试框架 补充1 :元数据 参考文章: 一 注解的定义 Java 注解是从 Java5 开
本书是《轻量级java ee企业应用实战》的姊妹篇,《轻量级java ee企业应用实战》主要介绍以spring+hibernate为基础的java ee应用;本书则主要介绍以ejb 3+jpa为基础的java ee应用。ejb 3、jpa规范都属于sun公司所...
Structure /src/main/java ┬ ├ annotation ├ callback ├ concurrent Java多线程编程核心技术 ├ crawler ├ data_structure ... ├ lambda JAVA 8实战 ├ netty Netty权威指南 ├ oop ├ recursion
随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序取得了显著的进步,提高了Java虚拟机的性能,提高了并发类的可伸缩性,并加入了丰富的...附录A 同步Annotation 参考文献 索引
视频教程
Android进阶——Java注解实战之APT构建模块化的第一步
java实战开发1200例源码欢迎来到 DECIPHER 项目 摘要/目录 项目概况 —— 联系信息 如果需要更多详细信息,请写信给我们。 Joe Corneli 一直在编辑这个自述文件。 Aleš 负责 BUT StoryScope 开发。 Jaroslav 负责 ...
第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 ...
第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2 JUnit 4快速进阶 16.2.1 JUnit 4概述 16.2.2 ...
前言 我们在上一篇基本上已经实现我们要的效果了,...annotation模块的gradle apply plugin: 'java-library' tasks.withType(JavaCompile) { options.encoding = UTF-8 } dependencies { implementation fileTree
java8 stream 源码 StudyNotes [TOC] Java Java编程思想 ...自己的Java学习笔记 为什么说HashMap是不安全的(即将开坑...) 什么是 APT(annotation processing tool) MARK 翻译 前端 Vue.js实战 HTTP 转载 JPA
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...
安卓java读取网页源码 OuNews 简单的新闻客户端 一、为什么写这个?...Java基础加强总结(一)——注解(Annotation) Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper 基于RxJava、RxAndroi
Java基础加强总结(一)——注解(Annotation) Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper 基于RxJava、RxAndroid的EventBus实现 深入浅出RxJava 五、声明 应用中展示的所有内容均搜集自互联
安卓java读取网页源码 XWLNews 简单的新闻客户端 零、项目性质 ...Java基础加强总结(一)——注解(Annotation) Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper 基于RxJava、RxAndroid的Even
安卓java读取网页源码 OuNews 简单的新闻客户端 一、为什么写这个?...Java基础加强总结(一)——注解(Annotation) Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper 基于RxJava、RxAndroi