设为首页 加入收藏

TOP

JDK中注解的底层实现(六)
2018-10-10 04:11:27 】 浏览:725
Tags:JDK 注解 底层 实现
nbsp;     try {
            return (Integer)super.h.invoke(this, m0, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }


    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
            m2 = Class.forName("java.lang.Object").getMethod("toString");
            m3 = Class.forName("club.throwable.annotation.Counter").getMethod("count");
            m4 = Class.forName("club.throwable.annotation.Counter").getMethod("annotationType");
            m0 = Class.forName("java.lang.Object").getMethod("hashCode");
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }
}


显然,$Proxy1实现了Counter接口,它在代码的最后部分使用了静态代码块实例化了成员方法的Method实例,在前面的代码对这些Method进行了缓存,在调用成员方法的时候都是直接委托到InvocationHandler(AnnotationInvocationHandler)实例完成调用。我们在分析AnnotationInvocationHandler的时候看到,它只用到了Method的名称从Map从匹配出成员方法的结果,因此调用过程并不是反射调用,反而是直接的调用,效率类似于通过Key从Map实例中获取Value一样,是十分高效的。


既然知道了注解的底层原理,我们可以编写一个"注解接口"和InvocationHandler实现来简单模拟整个过程。先定义一个接口:


public interface CounterAnnotation extends Annotation {


    int count();
}InvocationHandler的简单实现:


public class CounterAnnotationInvocationHandler implements InvocationHandler {


    private final Map<String, Object> memberValues;
    private final Class<? extends Annotation> clazz;


    public CounterAnnotationInvocationHandler(Map<String, Object> memberValues, Class<? extends Annotation> clazz) {
        this.memberValues = memberValues;
        this.clazz = clazz;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String methodName = method.getName();
        Object value;
        switch (methodName) {
            case "toString":
                value = super.toString();
                break;
            case "hashCode":
                value = super.hashCode();
                break;
            case "equals":
               

首页 上一页 3 4 5 6 下一页 尾页 6/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇什么是Hibernate延时加载? 下一篇JVM自定义类加载器加载指定classP..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目