forked from JavaDevTeam/notes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjava-annotation.java
More file actions
130 lines (107 loc) · 2.79 KB
/
java-annotation.java
File metadata and controls
130 lines (107 loc) · 2.79 KB
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
------------------------------
Annotation |
------------------------------
# 天下所有注解的父类都是 Annotation
# 可以标识的位置
类
类方法
构造器
类成员变量
方法参数
局部变量
包 -- 不能直接放,要通过反射,不然要挂
# 属性类型
八大基本数据类型
String
Enum
Class
可以是注解类型(注解类型里面类型就是另一个注解)
以上类型的一维数组类型(基本数据类型的包装类型也不能用)
# value 属性特权
当注解仅仅只有一个属性,且名字就叫做Value的时候,可以省略名称,直接写值
# 目标限定,和注解的保留策略限定
@Target
* 这个注解,只有一个属性,叫做:ElementType[] value();
* 这个ElementType是枚举,注意是枚举类,在这个注解里面是以数组的形式存在的.而且名字叫做value,想必你已经懂了,只有一个且名字叫做value,那不用指定名字赋值了
* 这个枚举有一些枚举对象:
> TYPE -- 当你选择这个,就允许你出现在类,接口,枚举类上
> FIELD -- 成员变量
> METHOD -- 成员方法
> PARAMETER --
> CONSTRUCTOR -- 构造器
> LOCAL_VARIABLE --
> ANNOTATION_TYPE -- 注解...
> PACKAGE -- 包(不能直接放...)
@Retention(RetentionPolicy.RUNTIME)
* 大多数时候保留策略都是 'RUNTIME'
# Demo
@interface Ann{
int a(); //int类型
String b(); //字符串类型
MyEnum c(); //枚举类型
Class d(); //Class类型
MyAnn e(); //也是注解类型
String[] f(); //数组类型
}
@Ann(
a=100,
b="kevin",
c=MyEnum.A,
d=String.class,
e=@MyAnn("这个注解的值"),
f={"字符串","数组"}//注意注意注意....当只有一个元素的时候可以省略大括号
)
------------------------------
JAVA8特性 |
------------------------------
# 可重复注解
* 示例
@MyAnnotation("123456")
@MyAnnotation("123457")
* 定义
@Repeatable
Class<? extends Annotation> value();
* 指定可以被重复注解的注解类
@Repeatable(MyAnnotations.class) //指定容器类
@MyAnnotation{ //定义注解
String value;
}
@MyAnnotations{ //定义容器类注解
@MyAnnotation[] myAnnotation;
}
* 获取
T[] getAnnotationsByType(T.class);
* 重复定义了N多注解,以数组形式返回
# 用于类型的注解
@Target
> TYPE -- 当你选择这个,就允许你出现在类,接口,枚举类上
> FIELD -- 成员变量
> METHOD -- 成员方法
> PARAMETER --
> CONSTRUCTOR -- 构造器
> LOCAL_VARIABLE --
> ANNOTATION_TYPE -- 注解...
> PACKAGE -- 包(不能直接放...)
新的
------------------------------
Inherited |
------------------------------
# 允许子类继承父类的注解
import java.lang.annotation.*;
@Inherited
@Target(value = {ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Foo {
}
@Foo
public class Foo1 {
}
public class Foo2 extends Foo1 {
}
public class Main {
public static void main(String[] args) {
// true
boolean result = Foo2.class.isAnnotationPresent(Foo.class);
System.out.println(result);
}
}