Java注解
一、简介
Java注解(Annotation),又称标注;是JDK1.5引入的一种新的注释机制,可以标注在Java类、方法、变量上;可在运行时,通过反射获取标注的内容。同时也支持自定义注解;
1.1 定义注解
定义一个注解,使用 @interface,示例如下:
@Document
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
1.2 元注解
元注解 指的是在JDK中自带的注解;包括:
- @Document:定义是否包含在javadoc中;
- @Inherited:注解是否可被继承;
- @Target:注解的作用目标;
- @Retention:注解的保留策略。
其中在自定义注解时, @Document、@Inherited选用;而@Target和@Retention是必须的。其中@Target的默认值为ElementType.class
1.3 @Inherited
元注解之一,主要用于定义注解是否被子类继承;
例如:
/**
* 自定义注解A
*/
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
public String value() default "";
}
/**
* 自定义注解B
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Bnno {
public String value() default "";
}
/**
* 父类
*/
@Anno("test")
@Bnno("test")
public class Father {
private String name;
private Integer age;
public String getName() {
return this.name;
}
public Father setName(String name) {
this.name = name;
return this;
}
public Integer getAge() {
return this.age;
}
public Father setAge(Integer age) {
this.age = age;
return this;
}
}
/**
* 子类:父类中,使用了两个注解 Anno和Bnno,其中Anno注解使用了@Inherited定义,
* 所以在子类继承父类时,子类自动添加注解@Anno;
*/
public class Child extends Father{
}
1.4 @Targer
@Target 用于定义注解的可作用范围;
类型 | 作用范围 |
---|---|
ElementType.TYPE | 接口、类、枚举、注解 |
ElementType.FIELD | 字段、枚举的常量 |
ElementType.METHOD | 方法 |
ElementType.PARAMETER | 方法参数 |
ElementType.CONSTRUCTOR | 构造函数 |
ElementType.LOCAL_VARIABLE | 局部变量 |
ElementType.ANNOTATION_TYPE | 注解 |
ElementType.PACKAGE | 包 |
1.5 @Retention
@Retention 定义注解的保留策略;
三种类型:
- RetentionPolicy.SOURCE : 注解仅存在与源码中,在class字节码文件中不包含
- RetentionPolicy.CLASS :默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
- RetentionPolicy.RUNTIME :注解会在class字节码文件中存在, 在运行时可以通过反射获得
二、使用
/**
* 自定义注解
* @Auther: Kellan_Song
* @Date: 2019/1/31 14:18
*/
@Document
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
public String value() default "";
}
@GetMapping(value = "/{name}")
@Test("hello method test annotation")
public ResultJson<String> hello(@PathVariable(name="name") String name) {
ResultJson<String> resultJson = new ResultJson<>();
resultJson.setResult("Hi! " + name);
return resultJson;
}