我在Java的同一包中有几个类。我想从一个以类名作为字符串的数组中实例化这些类的对象。
这是我要使用的类的示例,它们都具有相同的结构。
class Class1 {
public String[] firstMethod(){
String[] data = {"NEW_ITEM"};
return data;
}
}
这是我试图从中实例化它们的课程。
class Main {
static {
String[] classes = {"Class1","Class2"};
for (String cls : classes) {
try {
Object o = Class.forName(cls).newInstance();
o.firstMethod();
} catch(ClassNotFoundException | IllegalAccessException | InstantiationException ex) {
System.out.println(ex.toString());
}
}
我的问题是,当我尝试使用对象o调用firstMethod()时,出现此错误。
exit status 1
Main.java:19: error: cannot find symbol
o.firstMethod();
^
symbol: method firstMethod()
location: variable o of type Object
1 error
我怀疑是因为它属于对象类型,而不是Class1类型。我已经看到了将对象转换为所需类的对象的解决方案。但是,当您打字时,您需要使用类的名称,这正是我要避免的名称。我需要使用类名作为字符串。
有人知道我可以用创建的对象调用方法的解决方案吗?
答案 0 :(得分:0)
您不能以代码中的方式调用方法,因为您有一个不知道Class1类型的对象。您需要像
一样显式地进行投射((Class1)o).firstMethod()
我认为这不是您想要的。
或者,您可以遍历对象方法并像下面这样动态地调用它:
String[] classes = {"com.yourpackage.Class1", "com.yourpackage.Class2"};
for (String cls : classes) {
try {
Object o = Class.forName(cls).newInstance();
for(Method m : o.getClass().getMethods()) {
System.out.println(m.getName());
if ("firstMethod".equals(m.getName())) {
String[] data = (String[])m.invoke(o, null); // here are the parameters
for(String d : data){
System.out.println(d);
}
}
}
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException ex) {
System.out.println(ex.toString());
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
输出为:
NEW_ITEM