无法通过代理对象调用接口方法

时间:2013-02-22 19:33:49

标签: java

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

3 个答案:

答案 0 :(得分:3)

您创建了代理对象,但在调用Comparable之前未将其强制转换为compareTo。作为Object,Java编译器不知道proxy不是Object

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

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

此外,正如其他人所指出的那样,调用您的班级proxy和变量proxy可能会造成混淆。通常,类名是大写的,例如“代理”,甚至更好,“MyProxy”在这里避免与内置Java Proxy类的名称冲突。

答案 1 :(得分:2)

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

修改

我忘了,你只能将创建的代理转换为接口。你可以使用@rgettman sollution。

答案 2 :(得分:0)

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