上一篇文章 Java 注解简介 提到,注解本质是一个继承了Annotation 的特殊接口,起到说明、配置的作用。
今天我们就进一步了解它的原理以及如何自定义。
注解原理概述:(理解)
- 读取xml配置文件。(这里不做重点解读)
- 实例化bean。(这里不做重点解读)
- 遍历所有bean对象,再获取bean对象的所有方法或字段或属性,并进行遍历,判定其是否包含指定注解,若包含则进行注解的获取(通过反射获取注解,获取过程中会进行注解信息的解析,返回的是Java 运行时生成的动态代理对象$Proxy1)。
- 获取注解的代理对象后,就可以调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler 的invoke 方法。该方法会从memberValues 这个Map 中索引出对应的值。而memberValues 的来源是Java 常量池。
测试案例如下:(熟悉)
准备 Fruit 注解类
package com.gump.annotation.custom;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({
FIELD,METHOD})
@Retention(RUNTIME)
@Documented
public @interface Fruit {
/**
* 名称
*/
String name() default "";
/**
* 产地
*/
String address() default "";
}
准备 Apple 类
package com.gump.annotation.custom;
import lombok.Setter;
public class Apple {
@Fruit(name="新疆阿克苏糖心苹果",address="新疆阿克苏")
@Setter
private String apple;
@Fruit(name="gump",address = "中国")
public void sell(){
}
}
准备 FruitRun 测试类
package com.gump.annotation.custom;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.