TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
1 Q- }$ c& V, u' W+ i; h4 s注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。
& m/ U+ `3 B" _8 n
7 Z! s2 y& @7 m& D' M, [, V1 H1、元注解
4 ], E* h% e+ K5 ]) C/ s- O4 H _( e$ U2 G6 H
元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。- m* Q. {& {. }# E. ]
% ]; o- Y7 M- ?+ S) u
% z5 |8 S- u2 k) _4 z1.1、@Retention: 定义注解的保留策略
S2 G' ^. r& l4 r+ t! Q
( ]+ Z$ H" X* k4 M7 _2 m+ U@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含+ k6 U A+ }( ^' v/ C4 X3 V" e
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
+ x( ]; d+ Z; Q@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
/ I5 R/ l3 }) m
5 E6 I, S5 u2 S- W+ D3 o3 R. T1.2、@Target:定义注解的作用目标
1 {" u' E5 E: r/ A+ t$ i其定义的源码为:- @Documented3 f( K: ?% s9 K# [* T# A2 P
- @Retention(RetentionPolicy.RUNTIME)' [1 E3 }4 o: x+ C% u
- @Target(ElementType.ANNOTATION_TYPE)9 G2 G6 g# G, U0 c7 E
- public @interface Target {/ d6 H7 @+ D) _
- ElementType[] value();
; ~, r7 V! I* {" k' d; W - }
复制代码 0 q1 h" w3 |" K6 A' ~% p- ^
@Target(ElementType.TYPE) //接口、类、枚举、注解) ?& ?* d5 _0 C6 o [: i2 V, \ E
. J- z' k/ G+ B- k2 n Q" V; Y@Target(ElementType.FIELD) //字段、枚举的常量
6 O. L# P; o7 k@Target(ElementType.METHOD) //方法" e- y3 j. e" m
@Target(ElementType.PARAMETER) //方法参数/ x! X: I& @: G# n- k
@Target(ElementType.CONSTRUCTOR) //构造函数 @# q' y- q; [& s
@Target(ElementType.LOCAL_VARIABLE)//局部变量3 B7 z5 Q- _& t T$ s
@Target(ElementType.ANNOTATION_TYPE)//注解
0 c8 W. ^$ n* ?5 i3 z@Target(ElementType.PACKAGE) ///包
4 J) z/ [% l% \" j% a 由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等
3 S% x. s( o1 r1.3、@Document:说明该注解将被包含在javadoc中: B0 ]3 C9 |( {5 Q- M
5 z) X' J2 O$ [) \1 D' M7 ?* n1.4、@Inherited:说明子类可以继承父类中的该注解
3 X+ K' J2 p5 P9 D
2 n7 l) i, u+ {) U& S3 C7 T2、java 注解的自定义
2 L0 c, i* z/ [" J/ n 下面是自定义注解的一个例子5 O4 z; l# Y0 n: ]( F
@Retention(RetentionPolicy.RUNTIME)8 E( t# Y/ k, L6 Y
5 R% c( y( v3 T% @! F& v定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。
) w# r0 r# s5 m8 w
1 |. O* _, u: c@Target({ElementType.TYPE,ElementType.METHOD})+ P7 T/ J/ W+ `1 r" F4 }7 U
& K: q. m, ~. }! F$ u! C7 N因此这个注解可以是类注解,也可以是方法的注解$ D8 E9 G( f, d& p6 F7 ~" g
' E3 ^8 s1 b" H% N. q1 {8 P这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等( _: z$ o! F7 N* d
- o) [4 _4 Y' z# M) k% m
' f% e% B9 M5 N a3 ]1 |; K4 c3 [9 x
3 注解是定义好了,那么怎么来得到,解析注解呢?9 a2 K2 h3 h. Q( L
- A9 [+ y, j! |: E6 I
java的反射机制可以帮助,得到注解,代码如下:
6 M3 ?: @. U+ ]$ z c
! T! ~; u/ {. W K, w- T m, n" c* R! E+ o. Q( ?
以下是测试方法类
# L; ~1 ^+ n1 p4 _, Q! _$ {$ b! W4 s2 d5 U7 z& |3 H
|
|