实例化和使用Java中仅具有文本类名称的对象

时间:2018-11-23 21:50:02

标签: java reflection

我在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类型。我已经看到了将对象转换为所需类的对象的解决方案。但是,当您打字时,您需要使用类的名称,这正是我要避免的名称。我需要使用类名作为字符串。

有人知道我可以用创建的对象调用方法的解决方案吗?

1 个答案:

答案 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