TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。# @6 x1 l% \# S" R
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。* J. s. |% \* H
( ^ i- e5 U$ b' w% ?9 @1、元注解; I" d$ _; Q% [0 R
: H6 z8 l7 L& o$ x3 J1 V元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。
' I1 k; e2 I, t/ G7 V7 {
" u2 u) P/ Z& D) ?+ ?2 [$ x7 u( ?/ W) e5 i! L
1.1、@Retention: 定义注解的保留策略 S. o( p% N( k- o4 ~: x
8 k3 _' ?% M) p# V. n* t' I; B, ]6 O
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含8 h5 r1 d8 u9 W* z
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
1 ] `& K; J* Y1 z% x* ~@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
! i, d* |9 M9 z. ]
: x6 I w L) ?0 z9 R6 M; n1.2、@Target:定义注解的作用目标# C" H) N$ n* R; I3 @& ~
其定义的源码为:- @Documented+ n& Y9 X) I2 @) q
- @Retention(RetentionPolicy.RUNTIME). I6 m: m+ l: g' E# G
- @Target(ElementType.ANNOTATION_TYPE)
2 X# O$ U% m; V9 |, W# M - public @interface Target {
; c3 U0 _; X: m* q9 e - ElementType[] value();8 _) e% _* u% F, M% J, G1 L1 `
- }
复制代码 * a" {. Y' u. N+ Z2 @( f4 N: ?
@Target(ElementType.TYPE) //接口、类、枚举、注解/ y9 R/ ~) |3 \0 }# y
" u& E- X, H9 Q* C' e1 b
@Target(ElementType.FIELD) //字段、枚举的常量2 \) Y. ]% e0 V" J
@Target(ElementType.METHOD) //方法8 r* l' B. K$ n1 _# E+ V
@Target(ElementType.PARAMETER) //方法参数
% r: O7 O9 z8 @+ V@Target(ElementType.CONSTRUCTOR) //构造函数
8 X* K" V) g3 Q9 ]0 C! I# R/ t@Target(ElementType.LOCAL_VARIABLE)//局部变量
( B4 l3 Q) i, M5 s@Target(ElementType.ANNOTATION_TYPE)//注解- T9 a- @& M- W! y4 ]) {* y8 ]# l0 `
@Target(ElementType.PACKAGE) ///包 " O. j1 `; {5 B
由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等: u2 G9 W4 k: V1 A* ~; I5 G7 q
1.3、@Document:说明该注解将被包含在javadoc中
# Q$ Y4 Y* a/ @- w; U( L
8 o; ^9 ^2 w( h" Z3 F. n9 @1.4、@Inherited:说明子类可以继承父类中的该注解+ q$ }" ~- e! {$ g
% ?' H" ~& `. W2、java 注解的自定义1 n. B4 t7 m* Y g; [+ ~* u
下面是自定义注解的一个例子4 M' M+ d/ u q) V
@Retention(RetentionPolicy.RUNTIME)
$ r! ?, f k' O/ g& i/ R& R' Q* a
8 O" B, q2 s( ?: ]* e: {9 R定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。
" T7 T6 h. A% Z# h( ^9 W8 {: A: a2 B1 W# i6 V) l2 n- [
@Target({ElementType.TYPE,ElementType.METHOD})8 y7 I5 M) e3 \# U+ f+ h+ w
- v# ]/ _+ F( }
因此这个注解可以是类注解,也可以是方法的注解) b, r0 b( ?- t
& C2 {$ q; d1 M. {- u这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等6 d2 d$ _; l/ m, j: r
- y* _% \1 G6 M; s s7 S5 z
) G0 ?5 Y- N: t% g* l
7 u& R2 c8 V: X9 ^: m- W) T3 注解是定义好了,那么怎么来得到,解析注解呢?+ w3 e1 L" X/ a/ M0 l
4 d8 X% I+ r+ y. `8 f
java的反射机制可以帮助,得到注解,代码如下:
* Y0 u0 V- {$ J. g- V5 f9 N5 K6 q2 j! i0 G" D
: q( M- @% U4 D$ P5 n4 V以下是测试方法类+ a" k3 e% D/ Z+ l- s5 I
5 D" R% `# B- j7 ~, J |
|