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

java:从具有多态性的未知类调用静态方法,java,static-polymorphism,Java,Static Polymorphism,我有超类Token和一些子类,如Knight,King,Queen,等等 我需要一个随机标记类型,因此我将此方法称为: public Class randomTokenType(){ Class[] classes = { Bishop.class, King.class, Knight.class, Pawn.class, Queen.class, Rook.class }; Random random = new Random(); retur

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

我需要一个随机
标记
类型,因此我将此方法称为:

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();
编译器无法解决此方法,即使它是在
令牌
及其所有子类中实现的


我的错误是什么?

您实际上在寻找的是反射-请参阅

在您的情况下,这将是:

Method method = tokenType.getMethod("displayString");
method.invoke(null);
类对象是一种索引。它包含允许您查询实际.class文件包含的内容的方法(如其方法、字段、注释等)

您不能直接访问它们(比如索引只指向信息所在的位置,而不是信息本身),而是需要使用Class.getMethod(“nameofMethod”)查询索引

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

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

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

有关更多信息,我建议阅读反思,尤其是类的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);
 }
}
公共类{
公共静态void displayString(){
System.out.println(“Bishop”);
}
}
公开课考试{
公共静态void main(字符串args[])引发异常{
类标记类型=Bishop.Class;
Method=tokenType.getMethod(“displayString”);
方法调用(null);
}
}

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

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

  • 您要求一个类返回一些内容

    公共类randomTokenType()//不知道这是什么意思

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


您认为
类是什么?你为什么这么认为?多态性和
static
在Java中是矛盾的。另外,请不要为Java代码添加javascript代码段。看看帮助中心,了解如何正确发布代码片段。通常我在Smalltalk中编写代码,即使类也是对象。“类”和“对象”之间的行为没有区别。事实上,当最好的解决方案是使用完全不同的方法时,您的问题可能是“我如何解决这个代码问题”。考虑告诉我们你想解决的总体问题,而不是你现在试图解决的问题。已经试过了。我有个例外。与“.getDeclaredMethod”相同,问题是该方法是否为公共方法。我刚刚用:public类Bishop{public static void displayString(){System.out.println(“Bishop”);}
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);
 }
}