今天在写JDK动态代理时,需要调用函数newProxyInstance中 Class<?>[] interfaces参数的时候遇到一个bug
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
关于Class<?>[] interfaces参数,看下面两段代码
public class JdkProxyFactory {
public static Object getProxy(Object target) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 目标类的类加载
target.getClass().getInterfaces(), // 代理需要实现的接口,可指定多个
new DebugInvocationHandler(target) // 代理对象对应的自定义 InvocationHandler
);
}
}
public <T>T getProxy(Class<T> clazz){
return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[]{clazz}, RpcClientProxy.this);
}
第一段代码使用 getInterfaces()是因为:调用getProxy的对象实现了接口。
第二段代码使用new Class<?>[]{clazz}是因为:调用getProxy的对象是一个接口,他并没有实现接口