注解是什么
注解是Java5中提出对代码进行管理的一种方式,其相当于备注的作用.在Web框架中使用注解对使用框架的类/方法/变量进行管理.
注解的定义
如果你想自己定义一个注解,需要使用到元注解(Meta-Annotation),元注解共有4个,有Java源生提供.
- @Target: 标记了该注解用于注解什么元素,注解类?方法?变量?
- @Retention: 标记了该注解能够生效到哪个声明周期
- @Documented: 标记了该注解的成员是否被当作一个公共的API
- @Inherited: 标记了该注解是否可以被继承
在四个元注解中,Target和Retention是最常使用的,而后两个是可选的.
@Target
@Target说明了Annotation所修饰的对象范围,就是该注解可以用在什么地方,有的只能作用于类,而有的只能作用于方法等等.取值(ElementType)有:
- CONSTRUCTOR: 用于描述构造函数
- FIELD: 用于描述Class里的成员变量
- LOCAL_VARIABLE: 用于描述Method方法中的局部变量
- METHOD: 用于描述Class中的函数方法
- PACKAGE: 用于描述包
- PARAMETER: 用于描述参数
- TYPE:用于描述类Class、接口(包括注解类型本身)Interface 或enum声明
@Retention
@Retention定义了该Annotation被保留的时间长短,表示需要在什么级别保存该注解信息,用于描述注解的生命周期
1.SOURCE: 在Java源文件中有效(即到了Class文件就没了)
2.CLASS: 在Class文件中有效(即加载到内存就没了)
3.RUNTIME: 在运行时有效(到了内存要执行了还有)
这个就比较容易理解,一般框架中都是RUNTIME,因为都是动态去分析这些注解.
注解的成员
由于注解的载体(表现形式)是一种接口Interface,所以说要遵循接口的一些规则,其内部变量都是以函数形式存在,比如以下这个自定义注解
Custom是用于注解Class的一个注解,其声明周期可以存活到内存中的运行时
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Custom {
//String value default "value"; //错误的定义使用成员值
String value() default "value"; //正确的定义使用函数
String name() default "className";
}
如果想要定义一个值来保存字符串,必须使用value()函数形式,而不是value这种成员值.
注解成员的赋值
在使用注解时,可以对注解的成员进行赋值,如果不赋值则取default值
@Custom(value = "new value", name = "new name")
根据Java文档如果不适用指定成员的赋值,则是对value成员赋值
//If there is just one element named value, then the name can be omitted
@Custom("new value")