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

Posted

技术标签:

【中文标题】java:从具有多态性的未知类调用静态方法[重复]【英文标题】:java: call static method from unknown class with polymorphy [duplicate] 【发布时间】:2016-01-08 18:22:26 【问题描述】:

我有超类 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 及其所有子类中实现此方法,编译器也无法解析。

我的错误是什么?

【问题讨论】:

你认为Class 类是什么?你为什么这么认为?多态和static在Java中是矛盾的。 另外,请不要为Java代码添加javascript代码sn-p。看看帮助中心如何正确发布代码 sn-ps。 对不起,我是 Java 新手。通常我在 Smalltalk 中编码,其中甚至类都是对象。 “类”和“对象”之间的行为没有区别 您的问题实际上可能是XY Problem,当最好的解决方案是完全使用不同的方法时,您会问“我该如何解决这个代码问题”。考虑告诉我们您正在尝试解决的总体问题,而不是您当前尝试解决的方式。 【参考方案1】:

您真正在寻找的是反射 - 请参阅 Invoking a static method using reflection

在你的情况下是:

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

类对象是一种索引。它包含允许您查询实际 .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);
 

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

【讨论】:

已经试过了。我得到一个 NoSuchMethodException。与 '.getDeclaredMethod' 相同 问题是方法是否公开。我刚刚尝试过: public class Bishop public static void displayString() System.out.println("Bishop"); 【参考方案2】:

您的代码存在很多问题。很少有

你要求一个类返回一些东西。

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

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

【讨论】:

以上是关于java:从具有多态性的未知类调用静态方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java笔试题整理

Java中对域和静态方法的访问不具有多态性

java基础 静态 static 问在多态中,子类静态方法覆盖父类静态方法时,父类引用调用的是哪个方法?

java中的多态

《Java编程思想》笔记 第八章 多态

JAVA面向对象04