我一直在尝试开发一个应用程序。将根据需求编写bean脚本,然后根据需要以各种顺序调用方法(在应用程序中定义)。应用程序代码(bean脚本除外)不会更改。
此外,该应用程序使用外部jar,它提供了大量的方法 - 其中一些是在应用程序中实现的。但是,如果需求出现,我希望有可能使用其他方法(尚未实现的方法)而不对应用程序进行更改。为此,我想使用Java反射API。用户应该能够通过传递方法名称和相应的参数来调用外部jar中存在的任何方法(使用外部jar文档)。
我是一个java新手所以我有一些代码试图实现它(可能在语法上不正确):
public void callExternalJarMethod(String methodName, Class[] methodParameterTypes, Object[] methodParameters)
throws NoSuchMethodException {
String className = "SampleClassName";
Class classObject = Class.forName(className);
Method methodObject;
if (methodParameterTypes.length == 0) {
methodObject = classObject.getMethod(methodName, null);
} else {
methodObject = classObject.getMethod(methodName, methodParameterTypes);
}
// Not handling calling of static methods in which case "null" would be passed instead of methodObject to the invoke method
Object returnValue = methodObject.invoke(methodObject, methodParameters);
}
我试图找到一种方法可以获得Class [] methodParameterTypes,并使用相关值填充Object [] methodParameters。我将参数类型和参数值作为字符串。此外,任何指向有用的utils的指针都将受到赞赏。
提前致谢。
答案 0 :(得分:0)
您没有将 SampleClassName 的实例传递给此处的 Method.invoke()调用...
Object returnValue = methodObject.invoke(methodObject, methodParameters);
如果您要调用的方法是 static ,则可以执行此操作...
Object returnValue = methodObject.invoke(null, methodParameters);
否则(非静态),您需要创建一个 SampleClassName 的实例来执行该方法。
如果类不需要任何构造函数参数,则可以使用...
Object returnValue = methodObject.invoke(classObject.newInstance(), methodParameters);
(显然,你需要通过“newInstance”和“invoke”来处理一些异常...)