TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。" ?- M" s% B& A7 a5 l) T
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。$ h- C$ }6 b3 |; }+ q* H. L2 E
% s4 B9 d+ O6 f' Q2 J
1、元注解
3 C# r) s( s- G) @
& A! W- h& v. R: r8 S3 e2 D元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。
: w* F, i" N3 U& c. J8 ~
e( A U! o1 f* o1 X7 L: {2 X3 j
1.1、@Retention: 定义注解的保留策略
' e, Z C6 f" u! ?5 S7 l' F2 M) ]: c6 n& |
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含7 G* o7 b ? D* J
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
B* r) y `% P' l" j$ j: o" `& w6 m@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到6 Z. ?7 g! r$ M. T. T
0 d. S3 \$ Z9 E1.2、@Target:定义注解的作用目标
! \1 a V# u/ F其定义的源码为:- @Documented
/ ?# ?8 ~3 k. p( x5 y. [" \ - @Retention(RetentionPolicy.RUNTIME); l* F8 N" W% F- w# s
- @Target(ElementType.ANNOTATION_TYPE) t5 Q5 D8 i6 w
- public @interface Target {' [5 M$ l4 ]& @4 o' T: d
- ElementType[] value();
$ E4 y( `) b, b6 s) A - }
复制代码
- n( \$ y ]! W6 t@Target(ElementType.TYPE) //接口、类、枚举、注解4 n, z4 J& |( j- Q5 ]& n& z
; S( H2 g% Q4 N: E4 ~$ d: Q@Target(ElementType.FIELD) //字段、枚举的常量 l# J2 }; e' q
@Target(ElementType.METHOD) //方法2 r9 U4 h4 f) f6 T- ?( }
@Target(ElementType.PARAMETER) //方法参数( B5 B3 l; `3 k
@Target(ElementType.CONSTRUCTOR) //构造函数8 f# ^4 M' S' ?: S1 j X( M6 V! X
@Target(ElementType.LOCAL_VARIABLE)//局部变量
N" s( z ~& M9 }) A. i@Target(ElementType.ANNOTATION_TYPE)//注解& V/ I3 j7 E9 z9 e
@Target(ElementType.PACKAGE) ///包 / V& \, O+ o$ F' [. k/ d. |! v
由以上的源码可以知道,他的elementType 可以有多个,一个注解可以为类的,方法的,字段的等等# _$ n6 E b" A
1.3、@Document:说明该注解将被包含在javadoc中) W$ u8 _1 b" |. X- A- t) n
2 a' H* C! t8 @9 @3 V
1.4、@Inherited:说明子类可以继承父类中的该注解
. ~; V% B! V5 y. J7 I. ^
+ x5 B( x: |, v0 E! g2、java 注解的自定义6 G" \ r( q. L/ L' H
下面是自定义注解的一个例子
* _. ^0 y3 S& I/ I4 _2 t@Retention(RetentionPolicy.RUNTIME)' a6 ^; d% V( j1 ^- z/ m8 S3 s
5 Y/ q5 L9 t& u
定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。1 N9 V% e& L: {6 V9 _
& K( \& l8 z/ w q* U
@Target({ElementType.TYPE,ElementType.METHOD})& c, ?7 y" P2 t7 @8 J; I: Y) a
& R4 G# T, b* k6 ]6 _2 W/ d% k9 ]$ A
因此这个注解可以是类注解,也可以是方法的注解
8 O* M2 w* }: p: t8 p( j# _
P1 k6 \( s4 l' ?" ]! W% O这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等
' I( g2 N: k9 D1 K7 y( X' u" W5 G7 i' T. m
, p, ]8 h1 A U& R0 \) |
3 B5 r* J7 `! e% G5 _' Y3 注解是定义好了,那么怎么来得到,解析注解呢?/ N# Z1 K* y. o. }7 x
8 I" E: O7 ?1 Jjava的反射机制可以帮助,得到注解,代码如下:
4 u) O/ W+ d8 y O. `
, i- A. \8 T5 h) _) v( ` w+ M% k6 ?; B% @ w1 s. `- O: z [! }
以下是测试方法类
% t( \; M1 B# ~; w3 B
+ K& B6 r0 W6 }1 k7 F7 n |
|