1

解決できないと思う問題に直面していますが、試してみる価値はあります。次のクラスがあるとします。

package a;

public class A
{
    protected A() {}

    public static void staticMethod(A a) {
        // ...
    }
}

public class B extends A
{
    public B() {}
}

Bしたがって、他のパッケージからインスタンス化することはできますが、 A. ここで、 を使用したいと仮定しますClass.getMethod。ただし、次のようなある種の再帰フレームワークを使用しているだけです。

public Object callStaticMethod(Class c, String methodname, Object[] args)
{
    Class[] signature = new Class[args.length];
    for (i = 0 ; i < args.length ; ++i) {
        signature[i] = args.getClass();
    }
    Method m = c.getMethod("methodname", signature);
    return m.invoke(null, args)
}

この方法は現状のまま提供されており、残念ながら改善することはできません。次のようにメソッドを呼び出すことができます。

package b;

B b;
callStaticMethod(A.class, "staticMethod", b);

getClass()...それが機能しないことを除いて、生成された署名は (結果に基づいて) になり、 as パラメータを取るメソッドが呼び出され{B.class}ないためです。staticMethodAB

それについて知っている人はいますか?

BONUS :追加の課題として、このメソッドを使用して、null パラメーターを使用して呼び出す方法はありstaticMethodますか (これは、意味的にも完全に有効である可能性があります)。私は個人的に方法を見つけていません。

4

1 に答える 1

3

あなたがしなければならないことは、のようなものを使用してからClass.getMethods、各候補メソッドの適合性を確認することです。あなたは考慮したいかもしれません:

  • ボクシング (の値にlong.class有効です)Longargs
  • Varargs (したがって、String引数が 2 つある場合は、 のメソッドに対して有効であると見なすことができfoo(String... args)ます)
  • Null 互換性 (基本的に、すべてのクラス型パラメーターとの互換性)
  • 割り当ての互換性 (おそらく経由Class.isAssignableFrom)
  • ジェネリック(これはほぼ間違いなく恐ろしいことになります)

適用可能な候補メソッドが複数ある場合は、Java のオーバーロード ルールをエミュレートすることを検討することをお勧めします

于 2012-09-07T18:58:08.263 に答える