java注解

说起 java 的注解,通常被用于 javadoc 的生成和一些框架中。
用过 Spring Boot 的都会被其快捷的开发方式所折服,我们完全不需要配置那些令人头疼的 xml 文件。
只需要专注于代码的编写即可,而做到这些都归功于 java 的注解。

另外值的一说的是注解依靠的是 java 的反射实现的

定义

java 的注解是在 JDK5 的时候引入的,其提供了四种元注解,专门负责新注解的创建工作。

1
2
3
4
5
6
7
8
@Retention(RetentionPolicy.RUNTIME) // 生命周期
@Target({ElementType.FIELD,ElementType.METHOD}) // 范围
@Documented // 用于生成文档
@Inherited // 表示子类也可继承父类注解
public @interface Test { // 自定义注解使用 @interface
// 方法定义为无参数的。可使用 default 来定义默认值
int value() default 0; // 只有一个的话,只能为 value
}

各值所代表的含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Target 取值
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
}
// Retention 取值
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
}

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
String name() default "";
float height() default 0F;
int age() default 0;
}
public class Test {
@Person(name="张三")
String name;
public static void main(String[] args){
Field[] fields = Test.class.getDeclaredFields();
for (Field field : fields){
Person person = field.getAnnotation(Person.class);
System.out.println(person.toString());
}
}
}

有时间结合动态代理实现属性注入

0%