java: call static method from unknown class with polymorphy
我有超类Token和一些亚类,如Knight、King、Queen等。
我需要一个随机的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及其所有子类中实现的这种方法的困难。
我犯了什么错误?
- 你认为Class班是什么?你为什么这么认为?多态性和EDCOX1,1,在Java中是矛盾的。
- 另外,请不要为Java代码添加JavaScript代码片段。查看帮助中心,了解如何正确发布代码片段。
- 我是Java新手。通常我用smalltalk编写代码,其中甚至类都是对象。"类"和"对象"在行为上没有区别
- 实际上,您的问题可能是一个xy问题,当最佳解决方案是完全使用不同的方法时,您会问"我如何解决此代码问题"。考虑告诉我们你正在努力解决的整体问题,而不是你目前正在努力解决的问题。
您实际上要查找的是反射-请参见使用反射调用静态方法
如果是这样的话:
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);
}
} |
如果有参数或者它是私有的,那么这将不起作用。
- Already TriedI get an nouchmety exception.和我一起去吧
- The question is if the method is public.I just tried it with:Public class Bishop{Public static void displaysting(){system.out.println(Bishop");}
您的代码有很多问题。他们中的少数人是