TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
7 ^( ]! w p' G8 u注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。" ~* f) u% O- p& P7 Y& O; v5 Y
+ O8 _. z, R+ i0 B
1、元注解; r2 B* h# F" _( ~* w
! N1 h2 b* ]4 a元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。
/ f% @8 a( x# p+ s/ W# l. l
+ g) ?7 e+ G# ~; V" q. J @! c' _5 o2 H3 {/ n3 r+ \2 H, f5 A
1.1、@Retention: 定义注解的保留策略( z( R) @3 {2 t. q6 y
5 |& d7 B' Q9 o; O* p8 l1 |@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含' b8 ^" }. T( a# N
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,$ t! A9 h- A8 n! g. d! g6 l
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到# K0 B5 |5 B$ |$ e& u
$ E& Q6 i( L/ x3 l( i1.2、@Target:定义注解的作用目标
$ K9 }2 t/ d2 j其定义的源码为:- @Documented* c: ^" X1 O4 |- W
- @Retention(RetentionPolicy.RUNTIME)0 F1 C; q ~4 f. V h+ h5 N! [
- @Target(ElementType.ANNOTATION_TYPE), A3 g0 J2 K3 ]1 V4 a8 g& K2 g
- public @interface Target {' h( P6 ^: n2 P: g$ R
- ElementType[] value();
/ c3 J* E# e+ b/ s$ N - }
复制代码 0 x! r: Q6 c. b1 p. f
@Target(ElementType.TYPE) //接口、类、枚举、注解- g: W9 S$ B9 J/ k1 r
) i$ x0 `9 d8 r! R1 z: s
@Target(ElementType.FIELD) //字段、枚举的常量$ Z) @( N4 c7 @) s
@Target(ElementType.METHOD) //方法' B: D# r: J. a% a. }" P
@Target(ElementType.PARAMETER) //方法参数
+ H2 H6 Q0 j& l8 m- O6 t@Target(ElementType.CONSTRUCTOR) //构造函数& Q" }1 ~; R: @" G1 K
@Target(ElementType.LOCAL_VARIABLE)//局部变量
8 t3 F: c( Q% [! u3 f( o# W4 e/ F@Target(ElementType.ANNOTATION_TYPE)//注解
1 [2 G" d' J7 A7 [# m@Target(ElementType.PACKAGE) ///包 : `6 N: s# ]- U6 ^
由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等# t+ [! m% R! m3 Q# t+ n! X+ i
1.3、@Document:说明该注解将被包含在javadoc中
9 W& u+ n6 ?) a! `1 e x2 O
& D8 ]" X8 E) d1 B% y3 v$ a1.4、@Inherited:说明子类可以继承父类中的该注解
/ A$ B) I; `/ e( _! m* y' v# y( b& B: T) e. W" O
2、java 注解的自定义
" G3 a% S- F4 a 下面是自定义注解的一个例子
1 O0 `! r$ I# F9 x- B@Retention(RetentionPolicy.RUNTIME)
4 R$ f5 u( y" M
/ C0 W6 }& R0 O) k/ A定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。- W& A7 a2 d4 ?0 A0 e7 m$ C
2 n9 H9 V' X' [, `- B0 D, o& n- j/ b@Target({ElementType.TYPE,ElementType.METHOD})
5 T" P, R; I7 a* \0 E' W& Y7 m! L1 x+ r
因此这个注解可以是类注解,也可以是方法的注解) u1 x+ v5 J8 F, {
+ l2 z! [; d: S$ X0 q5 o; |, x这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等
+ ]( e' z. X# S
) [; A+ v5 x5 U( `6 O1 O* I6 D# T9 E# ]
+ J1 {" @1 l& C! v3 注解是定义好了,那么怎么来得到,解析注解呢?
+ ^+ `3 V4 ^: e( i
8 h5 D4 x+ V0 J. {java的反射机制可以帮助,得到注解,代码如下:- B; V6 r0 A$ |3 w4 G8 k
9 _ Y9 v* ^) ]! ? H
' @* W* u5 u! X5 V) c* B以下是测试方法类3 A' h4 |7 Z, g9 X: y0 c+ ?
8 R$ A) N; U+ ~: B& x0 L
|
|