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

私も整数で試しました...同じエラー。

4

3 に答える 3

3

Comparableプロキシ オブジェクトを作成しましたが、を呼び出す前に にキャストしていませんcompareTo。として、ObjectJava コンパイラーproxyはそれがObject.

Proxy のjavadocに従って、返されるプロキシは、元のオブジェクトの実際のクラスではなく、オブジェクトでサポートされているインターフェイスにキャストする必要があります。

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

さらに、他の人が指摘したように、クラスproxyと変数を呼び出すproxyと混乱する可能性があります。慣習的に、組み込みの Java クラスとの名前の衝突を避けるために、クラス名は大文字で表記されますProxy

于 2013-02-22T19:37:18.850 に答える
2

実際には . がないため、返さproxyれた を にキャストする必要があります。StringObjectcompareTo(String)

編集

忘れていたように、作成したプロキシをインターフェイスにキャストすることしかできません。@rgettman ソリューションを使用できます。

于 2013-02-22T19:37:40.243 に答える
0

プロキシ オブジェクトにはメソッドがありませんcompareTo。からそのインターフェイスを動的に実装したとしてもString、適切なインターフェイス (この場合はComparable) にキャストしないと、そのメソッドを呼び出すことはできません。

于 2013-02-22T19:38:26.470 に答える