本帖最后由 唐长智 于 2013-3-3 10:51 编辑
楼主的这个问题也困扰我很久了,于是早上我就找源代码开读。在Proxy的源代码里关于newProxyInstance是这么写的- public static Object newProxyInstance(ClassLoader loader,
- Class<?>[] interfaces,
- InvocationHandler h)
- throws IllegalArgumentException
- {
- if (h == null) {
- throw new NullPointerException();
- }
- Class cl = getProxyClass(loader, interfaces);
- //通过getProxyClass方法得到Class对象
- try {
- Constructor cons = cl.getConstructor(constructorParams);
- //用Class对象的构造方法来创建实例对象,也就是代理实例
- return (Object) cons.newInstance(new Object[] { h });
- } catch (NoSuchMethodException e) {
- throw new InternalError(e.toString());
- } catch (IllegalAccessException e) {
- throw new InternalError(e.toString());
- } catch (InstantiationException e) {
- throw new InternalError(e.toString());
- } catch (InvocationTargetException e) {
- throw new InternalError(e.toString());
- }
- }
复制代码 关键就在getProxyClass这个方法上,看他是怎么得到Class对象的。这个方法的源码实在太长,太复杂我不能完全看懂,就只能把关于ProxyClass相关的源码粘过来- byte[] proxyClassFile = ProxyGenerator.generateProxyClass( proxyName, interfaces);
- //是根据接口的Class对象来生成的
- try {
- // 动态地定义新生成的代理类
- proxyClass = defineClass0(loader, proxyName, proxyClassFile, 0,
- proxyClassFile.length);
- } catch (ClassFormatError e) {
- throw new IllegalArgumentException(e.toString());
- }
复制代码 通过这两段源码你就能看出来在newProxyInstance()方法的设计中,就是用传入的接口的Class对象得到构造函数来生成代理实例的,所以也就只能具备接口的功能。
|