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

时间:2022-11-28 15:39:41

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文件。