我最终接受了亚历克斯的建议。BeanUtils 对 bean 有很大帮助,但我不想只使用 Beans。FEST 看起来真的很酷,我已将其添加为书签以供进一步研究,但与 BeanUtils 一样,它似乎并不能解决我认为的难题。即,给定方法名称和参数列表,选择最“适合”参数的方法。如果一个方法采用浮点数并且我有一个双精度数,它应该足够聪明,不会因为签名不完全匹配而拒绝该方法。
显然,构建在 JVM 上的脚本语言解决了这个问题,但由于语言特定的优化,其方式比我需要的要复杂得多。因此,由于这是一个次要的实验性特性,我选择了一个使用 Java 1.6 中的脚本引擎支持(尤其是 JavaScript)的快速解决方案。这是基本思想:
private ScriptEngine engine = ... initialize with JavaScript engine ...
private Object invoke(Object object, String methodName, Object[] args)
throws RhsFunctionException
{
// build up "o.method(arg0, arg1, arg2, ...)"
StringBuilder exp = new StringBuilder("o." + methodName);
engine.put("o", object);
buildArgs(arguments, exp);
try {
return engine.eval(exp.toString());
}
catch (ScriptException e) {
throw new RhsFunctionException(e.getMessage(), e);
}
}
private void buildArgs(Object[] args, StringBuilder exp)
{
// Use bindings to avoid having to escape arguments
exp.append('(');
int i = 0;
for(Symbol arg : args) {
String argName = "arg" + i;
engine.put(argName, arg);
if(i != 0) {
exp.append(',');
}
exp.append(argName);
++i;
}
exp.append(')');
}
显然还有更多内容,但这是基本思想。我真的不喜欢建立一个字符串并对其进行评估,但是通过使用 Alex 建议的绑定,我避免了大多数转义的陷阱。此外,我有一个干净、简单的接口,如果证明有必要,我可以用“真实”实现替换它。
任何反馈或替代解决方案都非常受欢迎。