0

私は次のクラスを持っています:

interface Ivisitor{

    @deduceStrategy("...")
    void visit(Icosmos c);
}

訪問者はこのインターフェースを実装します:

class Visitor implements Ivisitor{
        @deduceStrategy("...") 
    public void visit(Icosmos c) 
    {
        ....
    }
}

動的プロキシ:

public class strategyLoader{
    public static <T> T  create(Class<T> clazz,Object wrap) {
       T object = (T) Proxy.newProxyInstance(strategyLoader.class.getClassLoader(), new Class[] { clazz },new Handler(wrap)); 
       return object;

    }
}

ハンドラークラスの関連部分:

public class Handler implements InvocationHandler {
 Object obj;
 public Handler(Object obj) {
 this.obj = obj;
 }

public Object invoke(Object proxy, Method m, Object[] args)
            throws Throwable {
        if (m.isAnnotationPresent(deduceStrategy.class)) {
     Class[] parameterTypes = m.getParameterTypes();
     if((parameterTypes.length==1)&&(**Icosmos.class.isInstance(parameterTypes[0])**))
         {
            ........
         }

Visitor.visitに渡されたIcosmosの正確なタイプに基づいて、適切な戦略をロードする必要があります。ただし、parameter[0]がIcosmosのインスタンスに解決されることはありません。誰かが私に道を教えてくれたら幸いです。クライアントはビジターを次のように呼び出します。

Ivisitor visitor = strategyLoader.create(Ivisitor.class,Visitor.class.newInstance());
4

1 に答える 1

1
Icosmos.class.isInstance(parameterTypes[0])

はとまったく同じであり、オブジェクトがのインスタンスであるparameterTypes[0] instanceof Icosmosかどうかをチェックします(そうではありません-それはです)。parameterTypes[0]Icosmosjava.lang.Class

本当に必要なものには2つの可能性があります。1つは

Icosmos.class.isAssignableFrom(parameterTypes[0])

parameterTypes[0]これは、クラスがとの割り当て互換性があるかどうかをチェックしますIcosmos。つまり、xで表されるクラスのインスタンスであるが与えられた場合parameterTypes[0]

Icosmos foo = x;

キャストなしで合法である。これにより、最初の仮パラメータの宣言された型がと互換性があるかどうかがチェックされますIcosmos

2番目の選択肢は

args[0] instanceof Icosmos

これは、仮パラメーターの宣言された型ではなく、実際の引数値の実行時型をチェックします。

于 2013-01-03T13:35:54.920 に答える