Как использовать метод класса, который я получил через Class.forName (String)? - PullRequest
1 голос
/ 13 мая 2019

Мне нужно использовать метод из класса, который я получил с помощью метода Class.forName ().Я приведу пример:

public class Greeter {
    public String getGreeting() {
        return "Hello World!";
    }
}

Теперь я хочу динамически получить этот класс, используя строку, и использовать его метод следующим образом:

Class c = Class.forName("Greeter");
System.out.println(c.getGreeting());

Теперь это явно неработать, потому что Java еще не распознает класс как класс Greeter.Как бы я поступил так без необходимости жестко кодировать тот факт, что это класс Greeter?

Ответы [ 2 ]

4 голосов
/ 13 мая 2019

Не напрямую, вам нужен экземпляр Class для вызова метода.Например,

Class<?> cls = Class.forName("Greeter");
try {
    Object o = cls.getConstructor(null).newInstance(null);
    System.out.println(((Greeter) o).getGreeting());
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Вы упоминаете в комментариях, что не "знаете", что это Greeter.Вы должны запрограммировать на общий интерфейс, но не получится;можно также получить метод по имени.Например,

Object o = cls.getConstructor(null).newInstance(null);
Method m = cls.getMethod("getGreeting", null);
System.out.println(m.invoke(o, null));
1 голос
/ 13 мая 2019

Если вы хотите использовать методы класса, не зная, что это за класс во время компиляции, вы можете использовать рефлексию:

Class<?> clazz = Class.forName("Greeter");
Object obj = clazz.getConstructor().newInstance(); // Use default constructor 
Method method = clazz.getMethod("methodName",<array of class objects representing argument types>);
Object result = method.invoke(obj,<array of arguments>);

Однако, как отмечено в первом ответе, лучше использоватьобщий интерфейс вместо отражения.

Редактировать: похоже, что другой ответ опередил меня.

...