黑马程序员技术交流社区
标题:
新手求助,关于动态代理的问题
[打印本页]
作者:
马甲大王
时间:
2013-3-20 16:58
标题:
新手求助,关于动态代理的问题
本帖最后由 张栓紧 于 2013-3-21 15:54 编辑
哪位大哥能给俺用语言解释下,动态代理是怎么实现的呢?
作者:
谢洋
时间:
2013-3-20 17:08
生成代理的原理分析:
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) { }
从上面分析及上面源代码可以知道:代理实例只能实现接口的方法,并不是实现了目标类的所有方法。
作者:
马甲大王
时间:
2013-3-20 17:10
谢洋 发表于 2013-3-20 17:08
生成代理的原理分析:
1、 通过目标实例,得到加载目标实例的类加载器,及目标类的实现的所有接口;
2、 通 ...
那能说下代理和动态代理的区别吗?
作者:
谢洋
时间:
2013-3-20 17:19
普通代理(静态),只能代理一个目标,如果要实现多个目标的代理,就得写多份代类似的代码;
而动态代理,你传什什么目标过来,我给你返回一个该目标的代理
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2