TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
! r5 Q' o* }' U: f+ A% `# B( p% h注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。( U9 i" |4 i9 p5 S. n
! x7 m. N# z4 E( n" C1、元注解: `& f% X( q: N+ a( F
( [( N# y+ \* |2 h2 a
元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。
) `9 W: r4 Q( {9 o/ Q; f; y; \5 k0 I' E, h( H( z
6 c, G& }1 R! } H' e, K4 d1.1、@Retention: 定义注解的保留策略- G0 Z* E7 x" Z: v
( H: w' V; \# Z) A@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含/ Y. A- [0 M* L6 G4 C* c' I4 U
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,) I& f( H7 w+ H" m; K# V( j& g
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到* ^& S2 K/ C# }4 M
1 c' e5 _' J7 x- W' i3 M; y) z
1.2、@Target:定义注解的作用目标& V D0 K6 z+ M& |
其定义的源码为:- @Documented' G; x( K; S/ |, r2 V
- @Retention(RetentionPolicy.RUNTIME)
" g7 e/ X2 F) P! O - @Target(ElementType.ANNOTATION_TYPE)7 o% }. y3 _% m G
- public @interface Target {
# t/ \: a, P) v5 S0 G4 @0 ?) @ - ElementType[] value();
0 B# Y$ S3 v' W - }
复制代码 - U* J5 h: @ u
@Target(ElementType.TYPE) //接口、类、枚举、注解
4 Q% j/ \ n! ~% V' Y, ~/ f2 L# M G" ?/ k- F) E
@Target(ElementType.FIELD) //字段、枚举的常量4 Z, R$ s% O3 W/ _7 A% p6 q2 p
@Target(ElementType.METHOD) //方法
9 B2 z* o9 I: p@Target(ElementType.PARAMETER) //方法参数
1 ]# v- d' G; X% w: v5 {3 R: q- J@Target(ElementType.CONSTRUCTOR) //构造函数& S6 ?7 m. X6 s
@Target(ElementType.LOCAL_VARIABLE)//局部变量
' a' A# P- k2 E# H8 g@Target(ElementType.ANNOTATION_TYPE)//注解: A% @# f* B% q0 A9 [+ A8 A
@Target(ElementType.PACKAGE) ///包 ) E$ x/ p0 _9 Q9 h7 ^
由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等 g7 V/ |5 X8 F4 K6 c
1.3、@Document:说明该注解将被包含在javadoc中; ?$ O9 T0 [! P R+ W) ?
$ \ ^. [! L- E/ C1 [6 f1.4、@Inherited:说明子类可以继承父类中的该注解3 ~' U: a$ K; A# |* z
9 y: I8 [5 `0 X' R. l" \2、java 注解的自定义
) u; j. C) v% }1 {# m$ P8 e 下面是自定义注解的一个例子
5 o8 e. j3 }& r0 p* v' L@Retention(RetentionPolicy.RUNTIME)
7 y" l# b* [7 C1 s$ @' l
0 g- I# J6 m. X# ]/ J" Q定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。, Y x6 J& U1 S4 q: h/ U0 |. `
$ ?, r4 z* B. B$ X# b
@Target({ElementType.TYPE,ElementType.METHOD})
& x8 T# @2 `. x' O1 U5 O/ l! o3 H
因此这个注解可以是类注解,也可以是方法的注解" p. O+ Z: F& j$ M6 E0 T8 d
( t$ v! u1 D2 v
这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等
4 F5 X6 ]( Y# a0 |0 A! C
2 s) V8 w5 p) z$ `! ?( H d+ ?0 `$ b. k; n- o+ T4 w; v2 t2 Q- t
3 G2 J, [6 C8 }& X3 注解是定义好了,那么怎么来得到,解析注解呢?
2 `/ n0 s; u+ j% E% j% [
' p8 {. M* D9 j( a. Zjava的反射机制可以帮助,得到注解,代码如下:) Q: A: f5 S: Y( V( y2 o
1 T M& d" b% k3 \5 X
8 k( _; t6 G1 C R2 p以下是测试方法类
# n3 W" J, z- W7 a9 J) U- c
: l& W! e' r: a& H5 f- u! Z |
|