Я закончила с предложением Алекса. BeanUtils очень помогает для бобов, но я не хочу работать только с бобами. FEST выглядит действительно круто, и я добавил его в закладки для дальнейшего изучения, но, как и в BeanUtils, он, похоже, не решает то, что я считаю сложной проблемой здесь. А именно, учитывая имя метода и список аргументов, выберите метод, который лучше всего подходит для аргументов. Если метод принимает число с плавающей точкой, а у меня двойное число, он должен быть достаточно умен, чтобы не отклонять этот метод, потому что подпись не совпадает точно.
Очевидно, что языки сценариев, построенные на JVM, решают эту проблему, но гораздо более сложным способом, чем мне нужно, из-за языковых оптимизаций. Итак, поскольку это небольшая и экспериментальная функция, я выбрал быстрое решение, использующее поддержку механизма сценариев (в частности, JavaScript) в Java 1.6. Вот основная идея:
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(')');
}
Это, очевидно, немного больше, но это основная идея. Мне не очень нравится создавать строку и оценивать ее, но с помощью привязок, предложенных Алексом, я избегаю большинства ловушек, связанных с побегом. Кроме того, у меня есть простой и понятный интерфейс, который я могу заменить «реальной» реализацией, если это окажется необходимым.
Любые отзывы или альтернативные решения приветствуются.