2019-01-06

原理阐述

注解本质是一个继承了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 {
}

自定义注解及对应的注解解析器,下期更新。

你可能感兴趣的:(2019-01-06)