TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
$ \2 L% U5 O0 o7 b+ J8 S9 r0 W注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。, ^5 I4 f/ d9 ?& y! z
5 P! _+ C) M. x" q3 W/ ]; ^3 Q1、元注解
. C: g) M) V- f; T* L" ?3 y7 h6 P/ o) d2 ]8 S% c
元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。1 Q$ P* t) ^/ N3 l& x
7 g3 s) g' Z7 m# X R$ p8 ]
: U6 n B2 B( a* a; ^; n) p5 |
1.1、@Retention: 定义注解的保留策略- G, f: k3 @0 p; {7 a) ?* c- Z* Q; \
/ W0 ] U1 l! \1 T@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含0 X, t1 S$ ^ s
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,3 U- B5 [! w" j8 \/ X5 z* Y. g
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
) O! }1 }" q$ p; F3 n) g, q9 N# c; b1 v7 T9 F
1.2、@Target:定义注解的作用目标# x; w, D) c* \) M1 M9 F* X
其定义的源码为:- @Documented2 n+ \6 E& i8 Q; m* a6 `" H/ Q4 ~
- @Retention(RetentionPolicy.RUNTIME)
3 R% {# m7 _2 E3 [3 C$ W z - @Target(ElementType.ANNOTATION_TYPE)! G/ U# F: @* @" A; U7 M1 ?
- public @interface Target {2 |4 y+ F6 D C2 i1 q- Y9 a1 W
- ElementType[] value();
" S* b# K' \$ w, J& p( h - }
复制代码 2 p, U# ~! _) K) G+ o& N. b
@Target(ElementType.TYPE) //接口、类、枚举、注解. A9 X+ X8 _4 @
& R7 o) m# n3 n2 X9 P@Target(ElementType.FIELD) //字段、枚举的常量
8 s6 A, d: C/ J+ h6 S@Target(ElementType.METHOD) //方法! h4 x% F/ C7 u+ T8 ^
@Target(ElementType.PARAMETER) //方法参数7 g3 ~3 j7 ?: T
@Target(ElementType.CONSTRUCTOR) //构造函数
" E/ @; ]/ b( O" ^@Target(ElementType.LOCAL_VARIABLE)//局部变量
& W$ [8 \% g' M0 h( U@Target(ElementType.ANNOTATION_TYPE)//注解
3 g+ j6 k9 ^$ P2 v) p@Target(ElementType.PACKAGE) ///包
& v: m% @- C8 W1 d- Z: Z 由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等
5 r1 @" |. R5 b6 O$ l4 x1.3、@Document:说明该注解将被包含在javadoc中2 {/ ?; \- E4 Q6 I
5 Y+ |, U7 X* [- O( _! a N7 O1.4、@Inherited:说明子类可以继承父类中的该注解- g, H; c3 j0 i- l( [: L2 r; r1 r
A1 t- W* y7 f
2、java 注解的自定义7 k) b3 G2 }3 A. e
下面是自定义注解的一个例子; a9 G6 @9 `. |) Z# m7 Z; R1 ?0 c
@Retention(RetentionPolicy.RUNTIME)7 i9 {; X! O' K# }! _
1 s7 @$ x) U" ]) F$ ^: W定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。0 k9 }" O0 r" `* q$ t3 J! p4 _
2 J$ x I6 C6 t& I7 m2 ?% k
@Target({ElementType.TYPE,ElementType.METHOD})
! V5 g6 K# y* l; J7 X# u% h% \. U& }# I% e) F, I3 Q" `" ~- Q! u
因此这个注解可以是类注解,也可以是方法的注解
9 _; m& a& d) |9 {6 ^5 r+ b; b' J( d, Z
这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等' P' F" A4 W7 |- h; ^
5 _5 K- a# P) O0 s6 a9 e% V7 i
) E0 D- [# W. z. K j
+ T5 x G0 Z# D/ u6 l
3 注解是定义好了,那么怎么来得到,解析注解呢?
- O0 O0 R, k# T! Q$ h0 k
7 j0 o" A# R. k* H# E4 f& `java的反射机制可以帮助,得到注解,代码如下:( y' ^2 \, p9 i$ z. I/ r
- R! v& Q" j; a- J; k; z9 _
" }% U4 a q1 B0 B- F以下是测试方法类8 Z, F7 o$ U9 }2 a1 ]
1 l1 L+ w( S7 `3 |& j5 {+ X) V4 l. d* F
|
|