码迷,mamicode.com
首页 > 其他好文 > 详细

动态代理的实现(Proxy类的实现)

时间:2015-07-19 16:25:31      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

1. Proxy类的

newProxyInstance 的实现:

1. 获得代理类,这个代理类有点类似与Proxy类的子类。这个代理类有一个接受

Proxy(InvocationHandler h) 的构造函数。

public static Object newProxyInstance(ClassLoader loader,

Class<?>[] interfaces,

InvocationHandler h){

Class<?> cl = getProxyClass(loader, interfaces);

Constructor cons = cl.getConstructor(constructorParams);

return cons.newInstance(new Object[] { h });

}

2. 获得代理类的 Proxy(InvocationHandler h) 构造方法。

3. 通过Constructor cons构造方法,获得代理类的实例。

2. 下面的重点就是getProxyClass是如何构造代理类的?

public static Class<?> getProxyClass(ClassLoader loader,

Class<?>... interfaces)

byte[] proxyClassFile = ProxyGenerator.generateProxyClass(

proxyName, interfaces);

proxyClass = defineClass0(loader, proxyName, proxyClassFile, 0, proxyClassFile.length);

return proxyClass;

}

上面的实现是简化后的核心代码。可以第一步:使用代理类生成器(ProxyGenerator)生成代理类文件(class文件)。第二步:用 classloader来加载该类。

三:ProxyGenerator类的 generateProxyClass 方法

ProxyGenerator gen = new ProxyGenerator(name, interfaces);

final byte[] classFile = gen.generateClassFile();

generateClassFile这个方法的实现大致是:生成一个继承自

/** name of the superclass of proxy classes */

private final static String superclassName = "java/lang/reflect/Proxy";

类的子类。实现每一个interfaces,实现的机制是:直接调用

/** name of field for storing a proxy instance‘s invocation handler */

private final static String handlerFieldName = "h";

的invoke方法。

注意,这里的实现策略,是直接生成二进制文件,而不是生成java文件,然后在编译生成class文件,而是直接生成class文件。

动态代理的实现(Proxy类的实现)

标签:

原文地址:http://www.cnblogs.com/a-ray-of-sunshine/p/4658720.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!