Java之注解解析
⼀、注解的基本概念
Java 注解就像修饰符⼀样,可以⽤于从java代码中抽取⽂档、跟踪代码中的依赖性或者在编译时做检查。注解可以被应⽤在包、类、⽅法、成员变量、参数和本地变量的声明中。我们⼤多数⼈最先接触的注解就是@Override。
注解的⼯作原理就是,先使⽤注解修饰java代码,然后另⼀块叫做注解处理器的代码会解析这段注解和被修饰的代码并做相应的处理。⼆、JDK内置的标准注解
JavaSE中内置了三个标准注解,都是定义在java.lang中,它们是:
1. @Override:⽤于修饰⼦类的⽅法覆盖了⽗类中的⽅法;
2. @Deprecated:⽤于修饰已经过时了的⽅法,不推荐使⽤的⽅法;
3. @SuppressWarnnings:告诉java编译器禁⽌编译警告。
2.1 @Override
@Override很简单,只是⼀个标记,⽤于标注⼀个⽅法。它表⽰,被它标注的⽅法覆盖了⽗类的⽅法。如果⼀不⼩⼼,⼦类的⽅法名写错了,有了@Override之后,编译时会报错。也就是说被@Override标注的⽅法如果没有覆盖⽗类的⽅法,编译时报错。
2.2 @Deprecated
@Deprecated也是⼀个标记注解,⽤于修饰⼀个⽅法。它表⽰此⽅法不推荐使⽤。⽆论是继承、覆盖或直接使⽤此⽅法,编译器都会给出警告。
2.3 @SuppressWarnings
字⾯翻译就是抑制警告,它⽤于告诉编译器,对被标注的这句代码不要给出特定的警告。
@SuppressWarnings有⼀些参数⽤于表⽰特定的警告:
1. deprecation:不要给出“不赞成使⽤的类或⽅法的警告”;
2. unchecked:不要给出“类型转换时警告”;
3. fallthrough:不要给出”switch语句块没有break的警告”;
4. path:不要给出“不存在的路径”的警告;
5. serial:不要给出“可序列化类缺少serialVersionUID”的警告;
python转java代码6. finally:不要给出“finally语句块不能正常完成”的警告;
7. all:不要给出以上所有情况的警告。
三、⾃定义注解
java允许我们⾃⼰定义注解,它提供了元注解⽤于⾃定义注解。
3.1 元注解
java提供元注解的⽬的就是让开发者⾃定义注解,元注解负责注解⾃定义注解。
1. @Target;
2. @Retention;
3. @Documented;
4. @Inherited。
Java5.0定义了4个元注解。接下来,分别分析这四个元注解:
3.1.1 @Target
@Target⽤来说明⾃定义注解可以⽤在什么地⽅,其ElementType取值有:
1. CONSTRUCTOR:⽤于描述构造器
2. FIELD:⽤于描述域
3. LOCAL_VARIABLE:⽤于描述局部变量
4. METHOD:⽤于描述⽅法
5. PACKAGE:⽤于描述包
6. PARAMETER:⽤于描述参数
7. TYPE:⽤于描述类、接⼝(包括注解类型) 或enum声明
使⽤⽰例:@Target(ElementType.FIELD)
3.1.2 @Retention
@Retention⽤来描述⾃定义注解的⽣命周期,其RetentionPoicy取值有:
1. SOURCE:在源⽂件中有效
2. CLASS:在class⽂件中有效
3. RUNTIME:在运⾏时有效
使⽤⽰例:@Retention(RetentionPolicy.RUNTIME)
3.1.3 @Documented
@Documented⽤于表⽰⾃定义注解可以被javadoc之类的⼯具⽂档化,没有成员。
使⽤⽰例:@Documented
3.1.4 @Inherited
@Inherited 元注解是⼀个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果⼀个使⽤了@Inherited修饰的annotation类型被⽤于⼀个class,则这个annotation将被⽤于该class的⼦类。
@Inherited annotation类型是被标注过的class的⼦类所继承。类并不从它所实现的接⼝继承annotation,⽅法并不从它所重载的⽅法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使⽤flect去查询⼀个@Inherited annotation类型的annotation时,反射代码检查将展开⼯作:检查class和其⽗类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
使⽤⽰例:@Inherited
3.2 开始⾃定义注解
定义注解格式:
public @interface 注解名 {定义体}
注解参数的可⽀持数据类型:
1. 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2. String类型
3. Class类型
4. enum类型
5. Annotation类型
6. 以上所有类型的数组
使⽤@interface⾃定义注解时,⾃动继承了java.lang.annotation.Annotation接⼝,由编译程序⾃动完成其他细节。在定义注解时,不能继承其他的注解或接⼝。
@interface⽤来声明⼀个注解,其中的每⼀个⽅法实际上是声明了⼀个配置参数。⽅法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
注意:
3.3 例⼦
定义⼀个注解@Info
[java]
1. kit.annotation.jdk.provider;
2.
3. import java.lang.annotation.Documented;
4. import java.lang.annotation.ElementType;
5. import java.lang.annotation.Retention;
6. import java.lang.annotation.RetentionPolicy;
7. import java.lang.annotation.Target;
8.
9. /**
10. * 定义基本信息Info注解
11. * @author liuyazhuang
12. *
13. */
14. @Target(ElementType.TYPE)
15. @Retention(RetentionPolicy.RUNTIME)
16. @Documented
17. public@interface Info {
18. String name() default"liuyazhuang";
19. int age() default18;
20. String[] hobby() default {"basketball", "football"};
21. }
再定义⼀个注解@Gender
1. kit.annotation.jdk.provider;
2.
3. import java.lang.annotation.Documented;
4. import java.lang.annotation.ElementType;
5. import java.lang.annotation.Retention;
6. import java.lang.annotation.RetentionPolicy;
7. import java.lang.annotation.Target;
8.
9. /**
10. * 定义性别注解
11. * @author liuyazhuang
12. *
13. */
14. @Target(ElementType.FIELD)
15. @Retention(RetentionPolicy.RUNTIME)
16. @Documented
17. public@interface Gender {
18.
19. public enum GenderEnum{BOY, GIRL}
20.
21. GenderEnum gender() default GenderEnum.BOY;
22. }
定义⼀个User类,使⽤刚才定义的两个注解:
1. kit.annotation.ity;
2.
3. kit.annotation.jdk.provider.Gender;
4. kit.annotation.jdk.provider.Info;
5. kit.annotation.jdk.provider.Gender.GenderEnum;
6.
7. /**
8. * 以注解标识的类
9. * @author liuyazhuang
10. *
11. */
12. @Info(name="liuyazhuang", age = 18, hobby = {"Java", "C", "Python", "Go"})
13. public class User {
14.
15. @Gender(gender = GenderEnum.BOY)
16. private String sex;
17.
18. public String getSex() {
19. return sex;
20. }
21.
22. public void setSex(String sex) {
23. this.sex = sex;
24. }
25.
26. }
定义⼀个注解处理器AnnotationProcess,⽤于处理注解内容:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论