TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。# e; [ `" T4 g8 F
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。
: v" F) Q8 u3 L
, R1 t/ E( m7 G( W1、元注解
- J, u4 C5 W, j$ `5 u4 I+ [
8 O4 c8 O3 e6 s元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。
: g% O' p+ o. h7 A E0 z" ^1 N8 R2 i' }# z8 ]- o5 f3 G: O6 A' J
6 r& l5 C- v6 K- W; I
1.1、@Retention: 定义注解的保留策略& ~4 m4 Q8 C( d9 x" s; I W! z* Y
8 y3 a0 t) q( E' H6 T+ i% r- u@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含$ x/ e+ j9 G F3 {$ z$ `4 b
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,. y, M' R5 O6 q. ]8 J0 A
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到 e9 ~ X- E3 ?& b: @% u2 N
5 J% ^0 {- ~4 \4 J7 x- T/ r
1.2、@Target:定义注解的作用目标
2 ^! H, E3 s1 ]( E7 P8 `* X其定义的源码为:- @Documented
2 W3 K" }' J1 O5 K: a( m - @Retention(RetentionPolicy.RUNTIME)% \; D, Z/ {0 A- p8 r
- @Target(ElementType.ANNOTATION_TYPE)
5 L! s9 R! v2 |+ C+ i+ q/ K - public @interface Target {& y$ s; y+ f# ]3 i* y" C2 ]' D2 w
- ElementType[] value();
" @9 Y' j5 J+ G" n- i$ V- P! c - }
复制代码 8 h& i3 d5 p' q, o7 M
@Target(ElementType.TYPE) //接口、类、枚举、注解
. R# e* _) f6 q9 u2 N/ `2 u$ j& b ^; d* l' l+ b2 P2 x
@Target(ElementType.FIELD) //字段、枚举的常量
' V; q$ n- Z3 ~3 X@Target(ElementType.METHOD) //方法
6 d ]9 Z0 u1 u; c6 @9 k! T@Target(ElementType.PARAMETER) //方法参数5 C, B0 i$ U+ x m! Z/ [
@Target(ElementType.CONSTRUCTOR) //构造函数4 o( i4 K. C% G* Y% R; K
@Target(ElementType.LOCAL_VARIABLE)//局部变量" M$ t* z' n% I* X
@Target(ElementType.ANNOTATION_TYPE)//注解
5 V/ B- z$ e! Y& P1 F. V@Target(ElementType.PACKAGE) ///包
3 J! b/ U! D# M2 l 由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等 T! f/ M% \ Y. E& o4 Y# C
1.3、@Document:说明该注解将被包含在javadoc中- M' D% [/ f o2 G* B: ?) n0 o4 t
; V( h$ k1 K/ B I1.4、@Inherited:说明子类可以继承父类中的该注解
& i- H7 u3 }9 J: K* D% j* N0 J1 ]! p
$ ~% k5 D" q ?# r4 V1 v2、java 注解的自定义
% F0 M$ |* v( ?8 j3 ? 下面是自定义注解的一个例子) v! N, A g! [& ]$ r9 Y1 }
@Retention(RetentionPolicy.RUNTIME)/ m' C; u Q+ L( i
5 I9 V% Q/ Z& r, o9 }) _& i/ q定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。
! `" {5 k v! _" ~6 g0 e, s$ N
( w, Z8 W; E5 G4 T% j9 q@Target({ElementType.TYPE,ElementType.METHOD})
* v( h2 F, L8 F, i5 R% A. Q& ^1 B ]# x
因此这个注解可以是类注解,也可以是方法的注解5 Z- z* R% k3 k
$ {# ^5 g$ {% S) U8 c T+ ^
这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等5 }" P+ _$ s& e" r6 {4 x+ V
: |& D# g6 U# @, z/ e8 b+ G4 u) v( d3 f8 y2 ~: u
/ L( X3 B" Y* H3 注解是定义好了,那么怎么来得到,解析注解呢?
5 Y+ v$ P2 H* j$ G! b1 I4 r& \; T
" Y0 l! u1 z4 Z, i0 D" v* H7 rjava的反射机制可以帮助,得到注解,代码如下:) _4 C/ F U7 m: n8 X
. Z) {4 f* M* {+ k6 [* l. Z" a6 i
以下是测试方法类( B. e' i6 c7 i$ f- z' [3 f+ Q
$ w7 v& y# n. l8 `7 U' S" r
|
|