public interface Subject {
public void shopping();
}
public class Person implements Subject{
@Override
public void shopping() {
System.out.println("Pay for the good!");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CreateProxy implements InvocationHandler {
private Object target;
public Object create(Object target) {
//生成代理对象
this.target = target;
Object xx = Proxy.newProxyInstance(this.getClass().getClassLoader(),
this.getClass().getInterfaces(),this);
return xx;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
method.invoke(target, args);
System.out.println("Pay successfully!");
return null;
}
}
import org.junit.jupiter.api.Test;
class ProxyTest {
@Test
public void test() {
CreateProxy cp = new CreateProxy();
Subject person = new Person();
Object proxy = cp.create(person);
Subject xxx = (Subject)proxy;
xxx.shopping();
}
}
报错:java.lang.ClassCastException: com.sun.proxy.$Proxy8 cannot be cast to dynamicProxy.Subject
生成的动态代理对象不能转成dynamicProxy包下的Subject接口
操作环境是JDK10,eclipse IDE
百度了好久,一开始觉得是Object对象是父类转成Interface接口子类 有问题但不是
其实是Proxy.newProxyInstance生成动态代理对象有问题
对应的newProxyInstance方法newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h
参数:loader
- 类加载器来定义代理类 interfaces
- 代理类实现的接口列表 h
- 调度方法调用的调用处理函数
上面代码中interfaces参数传入的有问题
解决办法:
interfaces参数改为new Class[]{dynamicProxy.Subject.class}