我使用java反射从.class调用API。我看到我的函数是.getMethods()API列出的函数列表。 no param版本工作正常,但参数化版本失败。
API的编译时调用是
public static class CapabilitiesEditor extends ComboBoxPropertyEditor {
public CapabilitiesEditor() {
super();
print(); // Call to print if fine .
setAvailableValues(new String[] { "High", "Medium", "Low", "None", }); // I want call this one . Fails
Icon[] icons = new Icon[4];
Arrays.fill(icons, UIManager.getIcon("Tree.openIcon"));
setAvailableIcons(icons);
}
这是我的代码,它试图动态更改setAvailableValues。
Class<?> cls;
// Paremeterized call
Class[] paramObject = new Class[1];
paramObject[0] = Object[].class; // Function takes a single parameter of type Object[]
Object[] params = new String[] { "H", "M", "L", "N" };
// no paramater version
Class noparams[] = {};
try {
cls = Class.forName("com.app.services.prop.system.SystemTopologyBean$CapabilitiesEditor"); Object obj = cls.newInstance();
for(Method method : cls.getMethods()){
System.out.println("method = " + method.getName());
}
// WORKS
Method method = cls.getDeclaredMethod("print", noparams);
method.invoke(obj, null);
// **DOES NOT WORK**
Method method = cls.getDeclaredMethod("setAvailableValues", paramObject);
method.invoke(obj, params);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
我总是得到以下异常
java.lang.NoSuchMethodException: com.app.services.prop.system.SystemTopologyBean$CapabilitiesEditor.setAvailableValues([Ljava.lang.Object;)
编辑:
的Mkyong精彩教程答案 0 :(得分:1)
要检索您的方法,然后调用它,您需要这样做:
Class cls = Class.forName("com.app.services.prop.system.SystemTopologyBean$CapabilitiesEditor");
Object obj = cls.newInstance();
Method method = cls.getDeclaredMethod("setAvailableValues", new Class[] {String[].class});
method.invoke(obj, new Object[] {new String[] {"Foo", "Bar"}});
答案 1 :(得分:0)
所以这里有两个问题阻止我访问该功能。请注意,我应该使用getMethod
代替getDeclaredMethod
请参阅Using .getDeclaredMethod to get a method from a class extending another回答,了解哪一个应该适用。
在调用method.invoke函数时尤其要小心第二个参数。
请参阅上面How to call MethodInvoke - reflection和迈克尔的回答,了解正确的致电方式。