java 自定义注解实践
背景
最近在为公司的技术改造做准备,我设计了一个提高 Web 开发效率的技术框架,为了
增加框架的友好性和易用性,决定采用注解来代替配置文件,于是我查询了很多的资料,
进行整理和学习。
概念
注解是 JDK5 引入的新特性,最初衍生自代码注释,但现在早已经超出了注释的范畴,
以至于我很惶恐,不敢使用注释这个词汇来描述他,尽管现有的很多资料里仍然称其为注
释。如果说反射使得很多技术实现(动态代理、依赖注入等)有了基础,那么注解就是使
这些技术实现变得平民化的基础。
从 class 文件规范中可以看出,JDK5 开始,class 文件已经引入了注解描述片段。站在
java 虚拟机的角度来看,class 保留和运行时保留的注解已经和 java 二进制码放在了同等的
地位。虚拟机在加载 class 文件时,会为注解内容分配空间并进行解析,最终还会为注解和
对应的二进制码建立关联。尽管这些注解不会被运行,但其对代码的说明能力,结合反射
技术已经足够我们做太多的事情。
我们知道,java 除了内置的注解(@Override、@Deprecated 等)以外,还支持自定义
注解(Struts、Hibernate 等很多框架甚至 java 自身都实现了很多自定义注解)。当然,更
为厉害的是元注解,元注解是用来描述注解的注解(光听着就觉得厉害了吧)。
要实现一个自定义注解,必须通过@interface 关键字来定义。且在@interface 之前,需
要通过元注解来描述该注解的使用范围( @Target)、生命周期( @Retenon)及其他
(其他的不重要,所以领盒饭了)。
@Target 用于描述注解的使用范围(即:被描述的注解可以用在什么地方),其 取值
有:
取值 描述
CONSTRUCTOR
用于描述构造器(领盒饭)。
FIELD
用于描述域(领盒饭)。
LOCAL_VARIABLE
用于描述局部变量(领盒饭)。
METHOD
用于描述方法。
PACKAGE
用于描述包(领盒饭)。
PARAMETER
用于描述参数。
TYPE
用于描述类或接口(甚至 enum)。
@Retenon 用于描述注解的生命周期(即:被描述的注解在什么范围内有效),其取