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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 奋发吧小白 高级黑马   /  2014-9-25 20:14  /  4177 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 奋发吧小白 于 2014-9-25 20:18 编辑

动态代理的三种实现方式:
1:通过接口的子类创建对象
2:通过匿名内部类来创建
3:通过Proxy的newProxyInstance方法直接去创建(最常用的一种方式)首先得到在内存中得到一份字节码,因为直接在内存中生成的字节码,所以要指定类加载器,并且要指定该字节码实现了那些接口。
然后再去获取相应的构造函数和方法。
往下即可创建代理对象。
方式一:通过接口的子类创建对象  
  步骤:1,获取代理的构造函数 2,写一个类实现构造函数传递的的参数接口InvocationHandler  3,创建代理对象
//获取代理的构造方法
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);   
//创建内部类MyInvocationHandler1,目的是传递给代理的构造器  
class MyInvocationHandler1 implements InvocationHandler
{  
   public Object invoke(Object proxy, Methodmethod, Object[] args)   throws Throwable
{  
return null;
      }  
}  
Collection proxy1 = constructor.newInstance(new MyInvocationHandler1());
方式二:匿名内部类
步骤:1,获得代理的构造函数  2,创建对象,参数一匿名内部类的方式实现InvocationHandler接口
Collection proxy2 =(Collection)constructor.newInstance(new InvocationHandler(){  
public Object invoke(Object proxy, Methodmethod, Object[] args)  
                   throws Throwable {  
               return null;  
            }      
        });
方式三,直接调用Proxy的newProxyInstance方法创建代理对象
newProxyInstance这个方法需要三个参数,可以直接创建target的代理对象
Object proxy3 = Proxy.newProxyInstance(  
               target.getClass().getClassLoader(),
                newClass[]{Collection.class},
                newInvocationHandler(){  
                  
                   public Object invoke(Object proxy, Method method, Object[] args)  
                            throws Throwable{  
                         return null;
                    }  
               }  
               );  


评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

3 个回复

倒序浏览
这三种方法原理不是一样吗 都需要类加载器和反射,没区别
回复 使用道具 举报
贾浩田 发表于 2014-9-26 01:10
这三种方法原理不是一样吗 都需要类加载器和反射,没区别

动态代理就是在类加载器基础上实现的~按照现在java语言 的设计模式 ,没有类加载器就不会有反射!
三种的区别只是实现的步骤不一样!
回复 使用道具 举报
还没看到,先来学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马