What
注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方式,使我们可以在稍后的某个时刻更容易的使用这些数据。
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记。
程序可以利用java的反射机制来了解你的类及各种元素上有无何种标记,针对不同的标记,就去做相应的事件。
Annotation(注解)是JDK5.0及以后版本引入的。它的作用是修饰程序元素。
元注解
适用于其他注释的注释称为元注释。在 java.lang.annotation 中定义了如下几个元注释类型。
- @Retention
指定标记的注解的生命周期:
属性 | 说明 |
---|---|
RetentionPolicy.SOURCE | 标记的注释只保留在源层中,在class字节码文件中不包含。可以在编译时生成代码等,比如 lombok。 |
RetentionPolicy.CLASS | 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获取 |
RetentionPolicy.RUNTIME | 注解会在class字节码文件中存在,在运行时可以通过反射获取到 |
- @Documneted
@Documented 注解表明,无论何时使用指定的注释,都应该使用Javadoc工具对这些元素进行文档化。(默认情况下,注释不包含在Javadoc中。)有关更多信息,请参见Javadoc工具页。
**
- @Target
@Target批注标记另一个批注,以限制批注可以应用于何种Java元素。目标注释指定以下元素类型之一作为其值:
属性 | 说明 |
---|---|
ElementType.ANNOTATION_TYPE | 应用于注解类型 |
ElementType.CONSTRUCTOR | 可以应用于构造函数 |
ElementType.FIELD | 可以应用于字段或属性 |
ElementType.LOCAL_VARIABLE | 可以应用于一个局部变量 |
ElementType.METHOD | 可以应用于方法级注释 |
ElementType.PACKAGE | 应用于包声明 |
ElementType.PARAMETER | 应用于方法的参数 |
ElementType.TYPE | 应用于类的任何元素 |
- @Inheritend
@Inherited 表明注解类型可以从超类继承(这在默认情况下是不对的)。当用户查询注释类型而该类没有对此类型的注释时,将查询类的超类以获取注释类型。此注释仅应用于类声明。
- @Repeatable
在Java SE 8中引入的 @Repeatable 注解表明标记的注解可以多次应用于相同的声明或类型使用。
**
How
自定义注解
在Java中,类使用class定义,接口使用interface定义,注解和接口的定义差不多,增加了一个@符号,即@interface。
示例
- 定义
定义一个标签注解。可以在类、方法、字段上使用。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.LOCAL_VARIABLE})
public @interface Tag {
/**
* tag 标签
*
* @return tag
*/
String value();
}
使用 ```java public class DefineMethod {
@Tag(“calc”) public void calcMethod() { }
@Tag(“print”) public void printMethod() { }
}
- **解析**
```java
public class DefineMethod {
/**
* 解析我们定义的标签
* 1. 可以根据属性的不同,进行我们希望的事情处理
*/
public static void main(String[] args) {
Method[] methods = DefineMethod.class.getDeclaredMethods();
for(Method method : methods) {
Tag tag = method.getAnnotation(Tag.class);
if(tag != null) {
System.out.println(tag.value());
}
}
}
}
/*======控制台========
calc
*/
注意:在实际开发中,可以和 spring 结合,发挥出更大的威力,详见aop模块。