如何使用通过 Class.forName(String) 获得的 class 方法?

How do I use a method of a class that I got via Class.forName(String)?

我需要使用通过 Class.forName() 方法获得的 class 中的方法。我给你举个例子:

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

现在我想使用字符串动态获取此 class 并使用它的方法如下:

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

现在这显然行不通,因为 Java 还没有将 class 识别为 Greeter class。我将如何着手执行此操作而不必硬编码它是一个 Greeter class?

不直接,您需要 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();
}

您在评论中提到您不 "know" 它是 Greeter。您应该针对通用接口进行编程,但是失败了;也可以通过名称获取方法。例如,

Object o = cls.getConstructor(null).newInstance(null);
Method m = cls.getMethod("getGreeting", null);
System.out.println(m.invoke(o, null));

如果你想在编译时不知道class是什么的情况下使用class的方法,你可以使用反射:

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>);

然而,如第一个答案中所述,最好使用通用接口而不是反射。

编辑:看起来其他答案抢先一步。