0
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;
}

代理对象可以在实现接口时调用接口。编译此代码时出现此错误。

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 ...同样的错误。

4

3 回答 3

3

您创建了代理对象,但Comparable在调用compareTo. 作为一个Object,Java 编译器不知道它proxy只是一个Object.

根据 Proxy 的javadocs,返回的代理必须转换为对象支持的接口,而不是原始对象的实际类。

Comparable c = (Comparable) Proxy.newProxyInstance(null,interfaces,handler);
System.out.println(c.compareTo("hoppu"));

此外,正如其他人所指出的,调用您的类proxy和变量proxy可能会令人困惑。按照惯例,类名是大写的,例如“Proxy”,或者更好的是“MyProxy”,以避免与内置 JavaProxy类发生名称冲突。

于 2013-02-22T19:37:18.850 回答
2

您需要将返回的内容proxy转换为String,因为Object实际上并没有compareTo(String).

编辑

我忘记了,您只能将创建的代理转换为接口。您可以使用@rgettman 解决方案。

于 2013-02-22T19:37:40.243 回答
0

您的代理对象没有compareTo方法。即使它确实从 动态实现了该接口String,如果不将其转换为适当的接口(在本例中为 ),您也无法调用该方法Comparable

于 2013-02-22T19:38:26.470 回答