一、注解概述:
1.注解不会对代码本身产生直接的影响。
2.注解可以用来修饰类(@Controller)、方法(@RequestMapping)、变量(@Autowired)、参数(@RequestBody)、包。
3.注解是一种元数据形式,类似于类、接口等,
二、自定义注解的具体实现:
1.定义注解:给注解下一个定义
注意:访问的修饰符必须是public,不写默认是public,注解类型的元素智能是基本的数据类型、String、Class、枚举值类型、注解类型(嵌套);当只有一个元素的时候,尽量把名字起为value;元素的()里不能有任何参数;如果没有默认值那后续使用必须给元素赋值。
常用的元注解:
@Target:声明该注解可以应用于那些元素上
public enum ElementType {
/** 类,接口(包括注解类型)或枚举的声明 */
TYPE,
/** 属性的声明 */
FIELD,
/** 方法的声明 */
METHOD,
/** 方法形式参数声明 */
PARAMETER,
/** 构造方法的声明 */
CONSTRUCTOR
/** 局部变量声明 */
LOCAL_VARIABLE,
/** 注解类型声明 */
ANNOTATION_TYPE,
/** 包的声明 */
PACKAGE
}
@Retention:声明注解的生命周期,生命周期有三个阶段:1、Java源文件阶段;2、编译到class文件阶段;3、运行期阶段。我们实际开发中的自定义注解几乎都是使用的RetentionPolicy.RUNTIME
public enum RetentionPolicy {
/**
* (注解将被编译器忽略掉)
*/
SOURCE,
/**
* (注解将被编译器记录在class文件中,但在运行时不会被虚拟机保留,这是一个默认的行为)
*/
CLASS,
/**
* (注解将被编译器记录在class文件中,而且在运行时会被虚拟机保留,因此它们能通过反射被读取到)
RUNTIME
}
@Document
注解是否被定义到JavaDoc文档中
@Inherited
是指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(Person.class)
public @interface Info {
String value() default "tracy";
boolean isDelete();
}
2.配置注解到所需要生效的位置(类、方法、变量、参数、包)
@Data
@Info(isDelete = true)
public class Person {
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private int age;
/**
* 是否有效
*/
private boolean isDelete;
}
3,解析注解,在编译阶段检测到注解,执行注解中所要执行的特殊操作。
@Info(isDelete = true)
public class Annotationtest {
public static void main(String[] args) {
Person person = new Person();
Class clazz = person.getClass();
if (clazz.isAnnotationPresent(Info.class)){
System.out.println(true);
Info infoAnno = (Info)clazz.getAnnotation(Info.class);
System.out.println("person.name :" + infoAnno.value() + ",person.isDelete:" + infoAnno.isDelete());
}else {
System.out.println(false);
}
}
}