-1

、、、などのTokenいくつかのサブクラスを持つスーパークラスがあります。KnightKingQueen

ランダムなTokenタイプが必要なので、このメソッドを呼び出します。

public Class randomTokenType(){
    Class[] classes = {
        Bishop.class, King.class, Knight.class, Pawn.class, Queen.class, Rook.class
    };
    Random random = new Random();
    return classes[random.nextInt(6)];
}

Class<Token> tokenType = randomTokenType();

次に、この tokenType で静的メソッドを呼び出したいと思います。次に例を示します。

tokenType.displayString()

コンパイラは、このメソッドが実装されていTokenても、そのすべてのサブクラスを解決できません。

私の間違いは何ですか?

4

2 に答える 2

1

実際に探しているのはリフレクションです-リフレクションを使用した静的メソッドの呼び出しを参照してください

あなたの場合、それは次のようになります:

Method method = tokenType.getMethod("displayString");
method.invoke(null);

Class-object は一種のインデックスです。実際の .class ファイルに含まれるもの (メソッド、フィールド、注釈など) を照会できるメソッドが含まれています。

それらに直接アクセスすることはできません(インデックスが情報自体ではなく、情報がある場所のみを指すように)-代わりに、Class.getMethod( "nameofMethod")でインデックスをクエリする必要があります

メソッドへの「ポインター」を取得したら、それを呼び出すことができます (Method.invoke 経由)。

メソッドの種類に応じて、invoke メソッドに null (静的メソッドの場合) またはオブジェクトのインスタンス (非静的メソッドの場合) のみを渡す必要があります。

リフレクションを使用すると、そのようなインスタンスをオンザフライで作成することもできます。

詳細については、リフレクション、特に Class の javadoc を読むことをお勧めします。それは多くを説明します。

編集: これは、displayString メソッドが次のように宣言されている場合にのみ機能します。

public class Bishop{
    public static void displayString() {
        System.out.println("Bishop");
    }
}

public class Test {
 public static void main(String args[]) throws Exception {
    Class<?> tokenType = Bishop.class;
    Method method = tokenType.getMethod("displayString");
    method.invoke(null);
 }
}

パラメータがある場合、またはそれがプライベートである場合、これは機能しません

于 2016-01-08T18:25:44.520 に答える
0

コードにはかなりの問題があります。それらのいくつかは

  • クラスに何かを返すように求めています。

    public Class randomTokenType() //これが何を意味するのかわからない?

  • メソッド定義に static を追加すると、そのメソッドは決してオーバーライドできません

于 2016-01-08T18:27:10.927 に答える