TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。' y3 e0 a6 z0 R" x
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。 R' ?; h( _4 l7 y. J4 N
) ]7 J H% Y; v, Q: m8 C; s" }$ }
1、元注解
1 B% ~8 Z$ V8 ^' A0 U; F: w3 ~9 m
' _* u, W/ E7 M/ K/ H1 J元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。
7 d8 i5 @9 Z# w
& B$ }/ X) U# ^ a. C( M! P
( L# P; f. \/ ]( w8 A: N: |$ {! T1.1、@Retention: 定义注解的保留策略+ F' C6 r7 I( H! b8 n6 S# F
3 m1 `. D, e) Q0 u: `) H9 E: ]6 d@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
+ @/ [/ q% w, D, \4 O% S@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,5 c3 W! s6 U M# X @
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到: ]! w) v9 A6 V1 |. e
/ _1 ^& Q6 J% C1 {6 ^0 n2 v2 @
1.2、@Target:定义注解的作用目标3 l9 Y& D. C% W) s9 @1 K6 z
其定义的源码为:- @Documented4 ?& W0 I: i2 p" {, w
- @Retention(RetentionPolicy.RUNTIME)
2 I2 v& |1 B4 a! w - @Target(ElementType.ANNOTATION_TYPE)
0 `3 Q; P/ ]8 |. M( s - public @interface Target {
6 l T$ c2 _7 Q; w8 D* U6 O, k - ElementType[] value();
$ o9 G% u6 r/ R! ^% l6 a2 X - }
复制代码
" o' |: j" L7 C u# Z6 M4 D@Target(ElementType.TYPE) //接口、类、枚举、注解
! x1 P' }9 H3 p- R5 ?( f
3 n/ u) _: s/ F4 O i+ _@Target(ElementType.FIELD) //字段、枚举的常量) c# I# E% ^ F& l+ U/ n- Q9 a) T
@Target(ElementType.METHOD) //方法
- I, S+ x9 V) \; z@Target(ElementType.PARAMETER) //方法参数/ Q5 B( x9 X! B ~2 T/ E7 A- X
@Target(ElementType.CONSTRUCTOR) //构造函数
4 V# Q6 C+ ?- |@Target(ElementType.LOCAL_VARIABLE)//局部变量
$ y" W3 x% O; {6 s+ m# C@Target(ElementType.ANNOTATION_TYPE)//注解7 j. R" P) \" M8 j; T5 U0 i' v- H
@Target(ElementType.PACKAGE) ///包
0 _9 s4 m; H, H) t7 l. l6 e 由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等6 d( W9 m/ M, A$ P4 U6 j
1.3、@Document:说明该注解将被包含在javadoc中. M, q/ ~, h0 D D( Y6 S- N( m
# h& l% o3 l* w( U0 z1.4、@Inherited:说明子类可以继承父类中的该注解' I2 s, K8 A: H$ N9 l
) m2 x {( m1 d# e) f" k( E: n! ]
2、java 注解的自定义, u/ H. S* o$ d! u, D- T
下面是自定义注解的一个例子' Y% j6 w7 l5 L
@Retention(RetentionPolicy.RUNTIME)
z& { u) a; o: @
/ e. s L5 d/ K# W3 w0 ` z定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。
* _) i |0 Z4 k. a4 [3 h! U Z' c3 o! x* r) R
@Target({ElementType.TYPE,ElementType.METHOD})
7 q! D$ S- T" g0 y+ j# O) [+ I3 M* |( {2 w3 @
因此这个注解可以是类注解,也可以是方法的注解
4 }! d: R! ]- O; }0 Q0 s+ Z( e4 z, M7 r6 h
这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等5 M: C' F3 {2 e$ s
3 D2 o. z3 D2 B: T8 d y ^# x
( i2 a d5 l- ?2 ]9 |8 a, r% r. s; }, @
3 注解是定义好了,那么怎么来得到,解析注解呢? k; v! J# @! D7 u3 h8 D+ |2 {4 ?& D
! P6 R) T7 S! m+ h8 r+ j) m% v
java的反射机制可以帮助,得到注解,代码如下:
0 m8 ~7 u" v6 I; J2 f* t0 c! B4 |( @: C g5 ~4 _) K; ^
1 ^& {0 Z5 p* j9 X" g
以下是测试方法类& f/ s3 b- h! m. H
F+ V; H0 T/ N% y9 M1 u |
|