Создавать и использовать объект только с текстовым именем класса в Java - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть несколько классов в одном пакете на 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());
    }
}

Моя проблема в том, что когда я пытаюсь вызвать firstMethod () с использованием объекта o, я получаю эту ошибку.

exit status 1
Main.java:19: error: cannot find symbol
    o.firstMethod();
     ^
symbol:   method firstMethod()
location: variable o of type Object
1 error

Я подозреваю, что это потому, что он имеет тип Object, а не тип Class1.Я видел решения, в которых вы приводите объект к нужному вам классу.Однако, когда вы печатаете, вам нужно использовать имя класса, чего я и стараюсь избегать.Мне нужно использовать имя класса в виде строки.

Кто-нибудь знает решение, где я могу вызывать методы с созданными объектами?

1 Ответ

0 голосов
/ 25 ноября 2018

Вы не можете назвать свой метод так, как в вашем коде, потому что у вас есть объект, который не знает тип 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...