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

时间:2019-05-12 23:02:01

标签: java methods method-call

我需要使用通过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 个答案:

答案 0 :(得分:4)

并非直接,您需要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 :(得分:1)

如果要使用类的方法而又不知道类在编译时是什么,则可以使用反射:

Traceback (most recent call last):

  File "<ipython-input-3563-1c97b7d5474f>", line 2, in <module>
    est2.fit(Xt)

  File "/home/sven/anaconda3/lib/python3.7/site-packages/sklearn/decomposition/pca.py", line 341, in fit
    self._fit(X)

  File "/home/sven/anaconda3/lib/python3.7/site-packages/sklearn/decomposition/pca.py", line 407, in _fit
    return self._fit_full(X, n_components)

  File "/home/sven/anaconda3/lib/python3.7/site-packages/sklearn/decomposition/pca.py", line 446, in _fit_full
    total_var = explained_variance_.sum()

  File "/home/sven/anaconda3/lib/python3.7/site-packages/numpy/core/_methods.py", line 36, in _sum
    return umr_sum(a, axis, dtype, out, keepdims, initial)

TypeError: float() argument must be a string or a number, not '_NoValueType'

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

编辑:看起来其他答案使我大吃一惊。