Java Proxy.newProxyInstance() 抛出类型转换异常?
Java Proxy.newProxyInstance() throws type cast exception?
我的以下代码尝试创建一个我希望在调用 "say()" 之前打印 "before" 的代理对象:
class Person2 {
private String name;
public Person2(String name) {
this.name = name;
}
public void say() {
System.out.println("Person:" + name);
}
}
class MyHandler implements InvocationHandler {
private Object object;
public MyHandler(Object o) {
object = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //
System.out.println("before");
return method.invoke(object, args);
}
}
public class TestProxy {
public static void main(String [] args) {
Person2 p = new Person2("myName");
InvocationHandler invocationHandler = new MyHandler(p);
Person2 obj = (Person2) Proxy.newProxyInstance(
p.getClass().getClassLoader(),
p.getClass().getInterfaces(),
invocationHandler);
obj.say();
}
}
但实际上会抛出异常:
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to Person2
at TestProxy.main
那么我哪里做错了,如何解决?
java.lang.reflect.Proxy
只能转换为 Interface
而且这行代码 p.getClass().getInterfaces()
会 return 空接口,因为 Person2
没有实现任何,
所以要解决这个 Person2
需要实现一个 Interface
:
public class Person2 implements IPerson{
private String name;
public Person2(String name) {
this.name = name;
}
@Override
public void say() {
System.out.println("Person:" + name);
}
}
接口:
public interface IPerson {
public void say();
}
然后在主静态方法中,可以将代理转换为接口并调用该方法:
public class TestProxy {
public static void main(String [] args) {
Person2 p = new Person2("myName");
InvocationHandler invocationHandler = new MyHandler(p);
IPerson obj = (IPerson) Proxy.newProxyInstance(
p.getClass().getClassLoader(),
p.getClass().getInterfaces(),
invocationHandler);
obj.say();
}
}
我的以下代码尝试创建一个我希望在调用 "say()" 之前打印 "before" 的代理对象:
class Person2 {
private String name;
public Person2(String name) {
this.name = name;
}
public void say() {
System.out.println("Person:" + name);
}
}
class MyHandler implements InvocationHandler {
private Object object;
public MyHandler(Object o) {
object = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //
System.out.println("before");
return method.invoke(object, args);
}
}
public class TestProxy {
public static void main(String [] args) {
Person2 p = new Person2("myName");
InvocationHandler invocationHandler = new MyHandler(p);
Person2 obj = (Person2) Proxy.newProxyInstance(
p.getClass().getClassLoader(),
p.getClass().getInterfaces(),
invocationHandler);
obj.say();
}
}
但实际上会抛出异常:
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to Person2
at TestProxy.main
那么我哪里做错了,如何解决?
java.lang.reflect.Proxy
只能转换为 Interface
而且这行代码 p.getClass().getInterfaces()
会 return 空接口,因为 Person2
没有实现任何,
所以要解决这个 Person2
需要实现一个 Interface
:
public class Person2 implements IPerson{
private String name;
public Person2(String name) {
this.name = name;
}
@Override
public void say() {
System.out.println("Person:" + name);
}
}
接口:
public interface IPerson {
public void say();
}
然后在主静态方法中,可以将代理转换为接口并调用该方法:
public class TestProxy {
public static void main(String [] args) {
Person2 p = new Person2("myName");
InvocationHandler invocationHandler = new MyHandler(p);
IPerson obj = (IPerson) Proxy.newProxyInstance(
p.getClass().getClassLoader(),
p.getClass().getInterfaces(),
invocationHandler);
obj.say();
}
}