A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马甲大王 中级黑马   /  2013-3-20 16:58  /  1724 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张栓紧 于 2013-3-21 15:54 编辑

哪位大哥能给俺用语言解释下,动态代理是怎么实现的呢?

点评

如果你的问题已经得到解决,请及时将主题改为[已解决],如果还有问题请继续追问!谢谢  发表于 2013-3-20 18:10

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

3 个回复

倒序浏览
生成代理的原理分析:
1、        通过目标实例,得到加载目标实例的类加载器,及目标类的实现的所有接口;
2、        通过InvocationHandler接口产生个子类对象;
3、        并把上面所得到的东西作为参数传给Poxy的静态方法newProxyInstance()
4、        该方法并执行Class cl = getProxyClass(loader, interfaces),得到代理类的字节码
5、        得到代理类指定参数所构造:Constructor cons = cl.getConstructor(constructorParams);
6、        有了构造就可以建立代理实例了:return (Object) cons.newInstance(new Object[] { h });
7、        源代码:上面分析跟源代码差不多吧
private final static Class[] constructorParams =
        { InvocationHandler.class };
public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
        throws IllegalArgumentException
    {
                if (h == null) {
                    throw new NullPointerException();
        }
        /*
         * Look up or generate the designated proxy class.
         */
        Class cl = getProxyClass(loader, interfaces);

        /*
* Invoke its constructor with the designated invocation handler.
         */
        try {
            Constructor cons = cl.getConstructor(constructorParams);
            return (Object) cons.newInstance(new Object[] { h });
        } catch (NoSuchMethodException e) { }
从上面分析及上面源代码可以知道:代理实例只能实现接口的方法,并不是实现了目标类的所有方法。

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
谢洋 发表于 2013-3-20 17:08
生成代理的原理分析:
1、        通过目标实例,得到加载目标实例的类加载器,及目标类的实现的所有接口;
2、        通 ...

那能说下代理和动态代理的区别吗?
回复 使用道具 举报
普通代理(静态),只能代理一个目标,如果要实现多个目标的代理,就得写多份代类似的代码;
而动态代理,你传什什么目标过来,我给你返回一个该目标的代理
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马