import java.lang.reflect.*;
import java.util.*;
public class proxy {
public static void main(String[] args) {
String s ="Happy";
InvocationHandler handler = new Handler(s);
Class[] interfaces = s.getClass().getInterfaces();
Object myproxy = Proxy.newProxyInstance(null,interfaces,handler);
System.out.println(myproxy.compareTo("hoppu"));
}
}
class Handler implements InvocationHandler {
public Handler(Object t) {
target = t;
}
public Object invoke(Object proxy,Method m,Object[] args) throws Throwable {
System.out.println(m.getName());
return m.invoke(target,args);
}
private Object target;
}
代理对象可以在实现接口(interface)时调用接口(interface)。当我编译此代码时,我收到此错误。
proxy.java:19: cannot find symbol
symbol : method compareTo(java.lang.String)
location: class java.lang.Object
System.out.println(proxy.compareTo("hoppu"));
^
1 error
我也尝试过使用 Integer ...同样的错误。
最佳答案
您创建了代理对象,但在调用 compareTo
之前没有将其转换为 Comparable
。作为一个 Object
,Java 编译器不知道 proxy
不是 Object
。
根据javadocs for Proxy,返回的代理必须转换为对象支持的接口(interface),而不是原始对象的实际类。 .
Comparable c = (Comparable) Proxy.newProxyInstance(null,interfaces,handler);
System.out.println(c.compareTo("hoppu"));
此外,正如其他人指出的那样,调用类 proxy
和变量 proxy
可能会造成混淆。按照惯例,类名都是大写的,例如“Proxy”,或者更好的是“MyProxy”,以避免与内置 Java Proxy
类发生名称冲突。
关于java - 无法通过代理对象调用接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15031868/