我需要使用我通过class.forname((方法获得的类中的方法。我给你一个例子:
public class Greeter {
public String getGreeting() {
return "Hello World!";
}
}
现在,我想使用字符串动态获取此类,并使用它的方法这样:
Class c = Class.forName("Greeter");
System.out.println(c.getGreeting());
现在这显然不起作用,因为Java还不将课程识别为迎宾班。我将如何去做这件事,而不必硬编码这是一个问候者类的事实?
不是直接,您需要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));
如果要使用类的方法而不知道compile时类是什么,则可以使用反射:
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>);
但是,正如第一个答案中指出的那样,最好使用常见接口而不是反射。
编辑:看起来其他答案击败了我。