猿问

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

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

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

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

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

现在这显然不起作用,因为Java还没有将该类识别为Greeter类。如果没有硬编码这是一个Greeter类的事实,我将如何去做呢?


达令说
浏览 1074回答 2
2回答

阿波罗的战车

不是直接的,你需要一个实例Class来调用方法。例如,Class<?>&nbsp;cls&nbsp;=&nbsp;Class.forName("Greeter");try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;o&nbsp;=&nbsp;cls.getConstructor(null).newInstance(null); &nbsp;&nbsp;&nbsp;&nbsp;System.out.println(((Greeter)&nbsp;o).getGreeting());}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block &nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();}你在评论中提到你不“知道”它是一个Greeter。你应该编程到一个通用的接口,但失败了;&nbsp;也可以按名称获取方法。例如,Object&nbsp;o&nbsp;=&nbsp;cls.getConstructor(null).newInstance(null);Method&nbsp;m&nbsp;=&nbsp;cls.getMethod("getGreeting",&nbsp;null);System.out.println(m.invoke(o,&nbsp;null));

慕哥6287543

如果要在不知道编译时类的内容的情况下使用类的方法,可以使用反射:Class<?> clazz = Class.forName("Greeter");Object obj = clazz.getConstructor().newInstance(); // Use default constructor&nbsp;Method method = clazz.getMethod("methodName",<array of class objects representing argument types>);Object result = method.invoke(obj,<array of arguments>);但是,如第一个答案中所述,最好使用通用接口而不是反射。编辑:看起来像另一个答案击败了我的拳头。
随时随地看视频慕课网APP

相关分类

Java
我要回答