使用java反射api调用的通用方法

时间:2015-04-16 10:33:38

标签: java reflection

我一直在尝试开发一个应用程序。将根据需求编写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的指针都将受到赞赏。

提前致谢。

1 个答案:

答案 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”来处理一些异常...)