我需要使用通过Class.forName()方法获得的类中的方法。我给你举个例子:
public class Greeter {
public String getGreeting() {
return "Hello World!";
}
}
现在,我想使用字符串动态获取此类,并像这样使用它的方法:
Class c = Class.forName("Greeter");
System.out.println(c.getGreeting());
现在,这显然不起作用,因为Java尚未将该类识别为Greeter类。我将如何去做而不必硬编码它是Greeter类的事实?
答案 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'
但是,如第一个答案所述,最好使用通用接口而不是反射。
编辑:看起来其他答案使我大吃一惊。