-1

我有超类Token和一些子类Knight,如King, Queen, 等。

我需要一个随机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 文件包含的内容的方法(如其方法、字段、注释等)。

您不能直接访问它们(例如索引仅指向信息所在的位置 - 而不是信息本身) - 相反,您需要使用 Class.getMethod("nameofMethod") 查询索引

一旦你获得了指向该方法的“指针”,你就可以尝试调用它(通过 Method.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() //不知道这是什么意思?

  • 如果您将静态添加到方法定义中,则该方法永远不会被覆盖

于 2016-01-08T18:27:10.927 回答