Java Annotation 必须掌握的特性
什么是Annotation?
Annotation翻译为中文即为注解,意思就是提供除了程序本身逻辑外的额外的数据信息。Annotation对于标注的代码没有直接的影响,它不可以直接与标注的代码产生交互,但其他组件可以使用这些信息。
Annotation信息可以被编译进class文件,也可以保留在Java 虚拟机中,从而在运行时可以获取。甚至对于Annotation本身也可以加Annotation。

那些对象可以加Annotation
类,方法,变量,参数,包都可以加Annotation。
内置的Annotation
@Override 重载父类中方法 @Deprecated 被标注的方法或类型已不再推荐使用
@SuppressWarnings 阻止编译时的警告信息。其需要接收一个String的数组作为参数。 可供使用的参数有:
- unchecked
- path
- serial
- finally
- fallthrough
可以用与其他annotation上的annotation
@Retention
确定Annotation被保存的生命周期, 需要接收一个Enum对象RetentionPolicy作为参数。
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
@Documented 文档化
@Target
表示该Annotation可以修饰的范围,接收一个Enum对象EnumType的数组作为参数。
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE
}
@Inherited
该Annotation可以影响到被标注的类的子类。
自定义Annotation
JSE5.0以后我们可以自定义Annotation。下面就是一个简单的例子。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodAnnotation {
}
下面的Person对象使用了自定义的MethodAnnotation。
public class Person {
public void eat() {
System.out.println("eating");
}
@MethodAnnotation
public void walk() {
System.out.print("walking");
}
}
我们可以通过反射获取Annotation的信息。
Class<Person> personClass = Person.class;
Method[] methods = personClass.getMethods();
for(Method method : methods){
if (method.isAnnotationPresent(MethodAnnotation.class)){
method.invoke(personClass.newInstance());
}
}
输出:
walking
我们也可以给自定义的Annotation加方法。
@Target(ElementType.TYPE)
public @interface personAnnotation {
int id() default 1;
String name() default "bowen";
}
下面是对personAnnotation的使用。
@personAnnotation(id = 8, name = "john")
public class Person {
public void eat() {
System.out.println("eating");
}
@MethodAnnotation
public void walk() {
System.out.print("walking");
}
}
Annotation是如何被处理的
当Java源代码被编译时,编译器的一个插件annotation处理器则会处理这些annotation。处理器可以产生报告信息,或者创建附加的Java源文件或资源。如果annotation本身被加上了RententionPolicy的运行时类,则Java编译器则会将annotation的元数据存储到class文件中。然后,Java虚拟机或其他的程序可以查找这些元数据并做相应的处理。
当然除了annotation处理器可以处理annotation外,我们也可以使用反射自己来处理annotation。Java SE 5有一个名为AnnotatedElement的接口,Java的反射对象类Class,Constructor,Field,Method以及Package都实现了这个接口。这个接口用来表示当前运行在Java虚拟机中的被加上了annotation的程序元素。通过这个接口可以使用反射读取annotation。AnnotatedElement接口可以访问被加上RUNTIME标记的annotation,相应的方法有getAnnotation,getAnnotations,isAnnotationPresent。由于Annotation类型被编译和存储在二进制文件中就像class一样,所以可以像查询普通的Java对象一样查询这些方法返回的Annotation。
Annotation的广泛使用
Annotation被广泛用于各种框架和库中,下面就列举一些典型的应用.
Junit
Junit是非常著名的一款单元测试框架,使用Junit的时候需要接触大量的annotation。
- @Runwith 自定义测试类的Runner
- @ContextConfiguration 设置Spring的ApplicationContext
- @DirtiesContext 当执行下一个测试前重新加载ApplicationContext.
- @Before 调用测试方法前初始化
- @After 调用测试方法后处理
- @Test 表明该方法是测试方法
- @Ignore 可以加在测试类或测试方法上,忽略运行。
- @BeforeClass:在该测试类中的所有测试方法执行前调用,只被调用一次(被标注的方法必须是static)
- @AfterClass:在该测试类中的所有的测试方法执行完后调用,只被执行一次(被标注的方法必须是static)
Spring
Spring 号称配置地狱,Annotation也不少。
- @Service 给service类加注解
- @Repository 给DAO类加注解
- @Component 给组件类加注解
- @Autowired 让Spring自动装配bean
- @Transactional 配置事物
- @Scope 配置对象存活范围
- @Controller 给控制器类加注解
- @RequestMapping url路径映射
- @PathVariable 将方法参数映射到路径
- @RequestParam 将请求参数绑定到方法变量
- @ModelAttribute 与model绑定
- @SessionAttributes 设置到session属性
Hibernate
- @Entity 修饰entity bean
- @Table 将entity类与数据库中的table映射起来
- @Column 映射列
- @Id 映射id
- @GeneratedValue 该字段是自增长的
- @Version 版本控制或并发性控制
- @OrderBy 排序规则
- @Lob 大对象标注
Hibernate还有大量的关于联合的annotation和继承的annotation,这里就不意义列举了。
JSR 303 – Bean Validation
JSR 303 – Bean Validation是一个数据验证的规范,其对Java bean的验证主要通过Java annotation来实现。
- @Null被注释的元素必须为 null
- @NotNull被注释的元素必须不为 null
- @AssertTrue被注释的元素必须为 true@AssertFalse被注释的元素必须为 false@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max, min)被注释的元素的大小必须在指定的范围内
- @Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
- @Past被注释的元素必须是一个过去的日期
- @Future被注释的元素必须是一个将来的日期
- @Pattern(value)被注释的元素必须符合指定的正则表达式
其实还有很多使用了annotaion的framework或library,这里就不一一列举了,希望大家能举一反三,深入了解Java中的annotation。
Java Annotation 必须掌握的特性的更多相关文章
- JAVA JDK1.5-1.9新特性
1.51.自动装箱与拆箱:2.枚举(常用来设计单例模式)3.静态导入4.可变参数5.内省 1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,更强大的JAX-WS5.轻量 ...
- Java Annotation手册
Java Annotation手册 作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig) 原文:http://www.matri ...
- 使用示例带你提前了解 Java 9 中的新特性
使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- Java Annotation概述
@(Java)[Annotation|Java] Java Annotation概述 用途 编译器的相关信息,如用于检测错误和一些警告 编译时和部署时的处理,如一些软件用于自动生成代码之类的 运行时处 ...
- Java Annotation 注解
java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...
- paip.Java Annotation注解的作用and 使用
paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...
- Java Annotation认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...
- Java Annotation原理分析(一)
转自:http://blog.csdn.net/blueheart20/article/details/18725801 小引: 在当下的Java语言层面上,Annotation已经被应用到了语言的各 ...
随机推荐
- maclean-【性能调优】Oracle AWR报告指标全解析 学习笔记
原文链接:http://www.askmaclean.com/archives/performance-tuning-oracle-awr.html AWR小技巧 手动执行一个快照: Exec dbm ...
- sql uniqueidentifier转varchar
--- DECLARE @myid uniqueidentifierSET @myid = NEWID()SELECT CONVERT(char(255), @myid) AS 'char';GO-- ...
- c++primerplus(第六版)编程题——第6章(分支语句和逻辑运算符)
声明:作者为了调试方便,每一章的程序写在一个工程文件中,每一道编程练习题新建一个独立文件,在主函数中调用,我建议同我一样的初学者可以采用这种方式,调试起来会比较方便. (具体方式参见第3章模板) 1. ...
- SGU 139.Help Needed!
题意: 判断15数码问题是否有解. 如果0的偏移量和逆序对个数同奇偶则无解. 因为目标状态的偏移量为0,逆序对为15,而0移动的时候偏移量±1,逆序对的改变量为也为奇数. 这就使得偏移量和逆序对数始终 ...
- 【HDU4366】【DFS序+分块】Successor
Problem Description Sean owns a company and he is the BOSS.The other Staff has one Superior.every st ...
- 了解负载均衡 会话保持 session同步(转)
一,什么负载均衡 一个新网站是不要做负载均衡的,因为访问量不大,流量也不大,所以没有必要搞这些东西.但是随着网站访问量和流量的快速增长,单台服务器受自身硬件条件的限制,很难承受这么大的访问量.在这种情 ...
- iOS 相机手动对焦
AVCaptureDevice的方法,之前查了网上和stackoverflow上,没有,于是自己试着做了下,成功了,分享下. //实例化 AVCaptureDevice *captureDevice ...
- 关于js中alert弹出窗口换行!
请用"\n" 如果这个不可以的话就是"\\n" 比如: <script type="text/javascript"> al ...
- iOS题
对于语句NSString* testObject = [[NSData alloc] init];关于testObject是什么类型对象,以下说法正确的是: 答案:(A) A.编译时,NSString ...
- Expert Shell Scripting
Expert Shell Scripting 好好学习这本书