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