本帖最后由 奋发吧小白 于 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; } } );
|