java:从具有多态性的未知类调用静态方法[重复]
Posted
技术标签:
【中文标题】java:从具有多态性的未知类调用静态方法[重复]【英文标题】:java: call static method from unknown class with polymorphy [duplicate] 【发布时间】:2016-01-08 18:22:26 【问题描述】:我有超类 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
及其所有子类中实现此方法,编译器也无法解析。
我的错误是什么?
【问题讨论】:
你认为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:从具有多态性的未知类调用静态方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章