黑马程序员技术交流社区
标题: 动态代理的三种实现方式 [打印本页]
作者: 奋发吧小白 时间: 2014-9-25 20:14
标题: 动态代理的三种实现方式
本帖最后由 奋发吧小白 于 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;
}
}
);
作者: 贾浩田 时间: 2014-9-26 01:10
这三种方法原理不是一样吗 都需要类加载器和反射,没区别
作者: 奋发吧小白 时间: 2014-9-26 07:16
动态代理就是在类加载器基础上实现的~按照现在java语言 的设计模式 ,没有类加载器就不会有反射!
三种的区别只是实现的步骤不一样!
作者: 戏言丶 时间: 2014-9-26 08:48
还没看到,先来学习一下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |