原理阐述
注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的JDK动态代理类。
注解的生命周期分为 定义注解、使用注解、解析注解。 解析注解的逻辑如果没有实现,那这个注解的作用还不如一行//表示的注释代码。 且解析注解必须使用反射,别无他法。
常见用法
1.生成javadoc文档。 @since 1.5
2.编译器注解,起到代码提示作用。@Override
3.自定义注解。实现特定功能,IOC
代码演示
- 演示注解原理
比如一个java annotation 是这样
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
String say() default "Hi";
}
编译过后的代码验证了注解的本质是接口:
public interface TestAnnotation
extends Annotation
{
public abstract String say();
}
使用测试类,输出JDK动态代理的实现类:
@TestAnnotation
public class TestA {
public static void main(String[] args) {
System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
TestAnnotation annotation = TestA.class
.getAnnotation(TestAnnotation.class);
System.out.println(annotation.say());
}
}
输出结果为 "Hi"
具体的代理类是这样:
public final class $Proxy1 extends Proxy
implements TestAnnotation{
public $Proxy1(InvocationHandler invocationhandler) {
super(invocationhandler);
}
public final String say(){
return (String)super.h.invoke(this, m3, null);
}
private static Method m3;
static {
m3 = Class.forName("p2.TestAnnotation")
.getMethod("say", new Class[0]);
}
}
- 演示注解使用实例
背景:
常用的工具BeanUtils可以对JavaBean进行属性拷贝等操作:
//把src的属性值拷贝到target中同名属性,注意参数的顺序
BeanUtils.copyProperties(src, target);
需求描述:类似于Hibernate Validator的分组校验功能,实现分组拷贝:
根据该注解中的值可以将bean中的属性字段进行分组。拷贝字段时,只拷贝指定分组的字段。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidationStep {
}
自定义注解及对应的注解解析器,下期更新。