JAVA动态代理_幸福就在那边_宗麟_新浪博客
JAVA动态代理的核心类是java.lang.reflect.Proxy
类结构如下所示:


其中核心的方法是newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)。
这个方法需要三个参数:ClassLoader,用于加载代理类的 Loader 类,通常这个 Loader 和被代理的类是同一个 Loader 类。Interfaces,是要被代理的那些那些接口。InvocationHandler,就是用于执行除了被代理接口中方法之外的用户自定义的操作, 他也是用户需要代理的最终目的。用户调用目标方法都被代理到 InvocationHandler 类中定义的{wy}方法 invoke 中。InvocationHandler是一个接口类,使用反射方法调用目标类中的方法,无论是否是公共的方法。

一般我们代理出来的类需要实现它所有的接口,而默认的getInterfaces方法只能获取该类自身所实现的接口,通过父类继承下来的接口就不能获取到了,此时只能递归获取所有的接口类。
以下的代码可以获取需要代理的类中的所有接口
-----------------------------------------------------
        List interfacelist = new ArrayList();
        Class clazz = UserManagerImpl.class;
        while (true) {
            interfacelist.addAll(Arrays.asList(clazz.getInterfaces()));
            clazz = clazz.getSuperclass();
            if (clazz.getSimpleName().equals("Object")) {
                break;
            }
        }
        Class[] interfaces = new Class[interfacelist.size()];
        for(int i = 0; i < interfaces.length; i++) {
            interfaces[i] = (Class)interfacelist.get(i);
        }
-----------------------------------------------------

当调用代理出来的类中的方法,将会是调用 InvocationHandler 的 invoke 方法。整个代理就是这样实现的。

如果说AOP非常高深莫测的话,那么明白了JDK代理机制以后,就比较容易了解其中的实现机制了。
理论上其充当的是类似于InvocationHandler的角色而已。
已投稿到:
郑重声明:资讯 【JAVA动态代理_幸福就在那边_宗麟_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——