TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。7 J; }$ D9 G/ J, |& w
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。
4 B; ?( m4 J8 g5 I: X8 x7 ^. M# \! N+ g3 N
1、元注解0 q. S" q: _2 g7 T: s: V
9 C: D3 L$ ~1 `( N( M
元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。
" b$ q- A# |+ _0 c+ \% K" ` p1 D8 Z7 U9 a; |( j- o
. ~4 f7 n: Z6 W
1.1、@Retention: 定义注解的保留策略# |5 W9 O$ O1 {; ~
$ V8 S1 ?! q, g: c& I% f9 d@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含+ F" q. j! p3 `; T5 c# c$ \( ]; l
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,# r" o4 _! l* ~
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到2 g7 _% K. K4 |: p7 ~1 H
! h( U% `+ B$ T1.2、@Target:定义注解的作用目标 X4 i1 q( D7 M" W# C0 g" b" f
其定义的源码为:- @Documented0 J. ^4 T N1 e; o9 n9 f. g
- @Retention(RetentionPolicy.RUNTIME)
" j9 i8 q$ D+ a6 m - @Target(ElementType.ANNOTATION_TYPE)& |; p+ E/ @1 Z a: _8 _
- public @interface Target {4 z5 t% p- q! W6 z% i8 c* J
- ElementType[] value();# y5 _" h7 r2 _. z' x6 P/ l ]# t
- }
复制代码 . a' H: S: z. o
@Target(ElementType.TYPE) //接口、类、枚举、注解
Y) L, s1 A& J8 N
/ n8 R0 _. m: I# O$ l! C@Target(ElementType.FIELD) //字段、枚举的常量5 z$ }( k* J( E+ Y0 f0 p
@Target(ElementType.METHOD) //方法
/ i" x+ v" E6 u2 ?7 P@Target(ElementType.PARAMETER) //方法参数9 Y, }) q& `. h& r& E/ q
@Target(ElementType.CONSTRUCTOR) //构造函数. F6 @# P# w7 {/ |3 S8 Y
@Target(ElementType.LOCAL_VARIABLE)//局部变量
* f* G1 u E% W. F; P; t" L@Target(ElementType.ANNOTATION_TYPE)//注解
' T, a# d" I; A. e@Target(ElementType.PACKAGE) ///包
& K( e( T, u- T# z+ I ?) P& X 由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等
. H* b8 _$ d3 M1.3、@Document:说明该注解将被包含在javadoc中& s3 h) e+ q2 N$ J5 Z
. q' u: M9 y$ p
1.4、@Inherited:说明子类可以继承父类中的该注解8 F$ @3 G6 i1 X
$ [" O% i2 [6 H# g& x1 ~; Z
2、java 注解的自定义
2 X7 T8 }: ~0 J9 l4 P. |$ x 下面是自定义注解的一个例子
. @3 A) F" N+ t% O! ]% M1 u! l@Retention(RetentionPolicy.RUNTIME)
$ M2 ^: r) N0 A4 Q2 L9 @$ h9 I6 [/ s4 B
定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。
* T9 t7 X& B( c: L
8 |" k' q. N: F3 X0 C# N& o@Target({ElementType.TYPE,ElementType.METHOD})4 Y. n+ U% i& N C7 d5 q7 J' d
. v1 {! ]1 W) }0 D# c0 g
因此这个注解可以是类注解,也可以是方法的注解
; V4 ?$ z% c, m% B7 s. q: c
+ J3 s# M5 Q8 w2 b这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等
6 J* e) T# K- V% C, H) G8 A1 ^. u1 ~
$ z2 f& L# @1 _: l- |
. u& v6 @. I5 L
3 注解是定义好了,那么怎么来得到,解析注解呢?
+ ~! S s" Z( B, r/ \. y/ U" b
: G. ^6 P( n" _: ajava的反射机制可以帮助,得到注解,代码如下:
8 Z, P3 k2 M. D1 U4 |
+ |0 B) G7 z( d2 c& {9 X, { T# B+ B; e' M. b: ]: i
以下是测试方法类
5 j- J* l6 M5 r, c8 B! @ p8 a+ y# {; E& p5 K
|
|