这个问题,就要去看一下OpenJDK的源码了:
//在Proxy类里中: //constructorParams的定义如下: private static final Class<?>[] constructorParams = { InvocationHandler.class }; //newProxyInstance无限精简之后就是: public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { //通过ProxyClassFactory调用ProxyGenerator生成了代理类 Class<?> cl = getProxyClass0(loader, interfaces); //找到参数为InvocationHandler.class的构造函数 final Constructor<?> cons = cl.getConstructor(constructorParams); //创建代理类实例 return cons.newInstance(new Object[]{h}); } //在ProxyGenerator类中: public static byte[] generateProxyClass(final String name,Class<?>[] interfaces, int accessFlags)){} private byte[] generateClassFile() {} //上面两个方法,做的就是: //将接口全部进行代理 //并生成其他需要的方法,比如上面用到的构造函数、toString、equals、hashCode等 //生成对应的字节码 //其实这也就说明了,为何JDK的动态代理,必须需要至少一个接口