java:从具有多态性的未知类调用静态方法

java: call static method from unknown class with polymorphy

本问题已经有最佳答案,请猛点这里访问。

我有超类Token和一些亚类,如KnightKingQueen等。

我需要一个随机的Token类型,所以我调用这个方法:

1
2
3
4
5
6
7
8
9
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上调用一个静态方法,例如:

1
tokenType.displayString()

编译器甚至无法解决在Token及其所有子类中实现的这种方法的困难。

我犯了什么错误?


您实际上要查找的是反射-请参见使用反射调用静态方法

如果是这样的话:

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

类对象是一种索引。它包含允许您查询实际.class文件包含的内容的方法(如方法、字段、注释等)。

您不能直接访问它们(就像索引只指向信息所在的位置,而不是信息本身),而是需要使用class.getmethod("nameofmethod")查询索引。

一旦获得指向方法的"指针",就可以尝试调用它(通过method.invoke)。

根据方法的类型,只需传递invoke方法null(对于静态方法)或对象的实例(对于非静态方法)。

反射还允许您动态创建这样的实例。

更多信息,我建议阅读反思,尤其是课堂上的JavaDoc。这解释了很多。

编辑:只有当方法displayString声明如下时,此操作才有效:

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
 }
}

如果有参数或者它是私有的,那么这将不起作用。


您的代码有很多问题。他们中的少数人是

  • 你在要求一个班级归还一些东西。

    public class randomTokenType()//不知道这是什么意思?

  • 如果将static添加到方法定义中,则该方法永远不会被重写。