Фон: В некоторых фреймворках Java, таких как Spring, есть возможность иметь методы, вызываемые с введенными значениями параметров. Хорошим примером является действие контроллера в Spring Web/MVC, которое получает значение POST и имеет атрибут перенаправления.Как работает инъекция параметров метода в Java
Пример:
@RequestMapping(value = "/testform", method = RequestMethod.POST)
public ModelAndView testform(@RequestParam(value = "postvalue") String postvalue, RedirectAttributes attributes)
{
if(postvalue.equals("Test"))
{
// Do stuff with attributes
}
return new ModelAndView("addresses");
}
Например, когда я хотел бы использовать что-то подобное в собственном приложении (Нет Spring не включены доступны) - я в конечном итоге с чем-то вроде этого (Hacked вместе):
Strign actionname = "mymethod";
Controller controller = new SampleController();
for(Method method : controller.getClass().getDeclaredMethods())
{
String name = method.getName();
if(name.equals(actionname))
{
int parametercount = method.getParameterCount();
if(parametercount == 0) // No parameter
{
ModelAndView view = (ModelAndView) method.invoke(controller);
// Do stuff
}
else if(parametercount == 1) // 1 String parameter
{
ModelAndView view = (ModelAndView) method.invoke(controller, new String("parameter1"));
// Do stuff
}
else if(parametercount == 2) // 2 String parameters
{
ModelAndView view = (ModelAndView) method.invoke(controller, new String("parameter1"), new String("parameter2"));
// Do stuff
}
else // Error
{
// Unsupported method
}
break;
}
}
Проблема: Это решение поддерживает только Пустоты, 1-параметров и 2-параметров методов, которые принимают строку в качестве аргумента - ничто иное
Вопрос: Как Java и Spring позволяют такую функцию? Имеет ли весна огромный массив методов.invoke (...), которые подходят для наиболее распространенных методов или есть более динамическое решение этой проблемы?
Окончательное решение: я закончил с этим (незавершенной) решения на основе Seelenvirtuose ответа:
else if(parametercount == 2)
{
Object[] parameters = new Object[2];
parameters[0] = new String("Hello");
parameters[1] = new String("world!");
method.invoke(controller, parameters);
}
Не используйте '==' для сравнения строк в Java. 'if (postvalue ==" Test ")' должно быть: 'if (postvalue.equals (" Test "))' – Jesper
Кроме того, никогда не нужно использовать 'new String (...)' с литералом. Просто напишите '' parameter1 "' вместо 'new String (" parameter1 ")'. – Jesper
Не используйте магию имени, используйте аннотации, например, Spring. Таким образом, вам не нужно полагаться на количество и порядок параметров, просто вызовите 'Method.getParameterAnnotations()' и используйте это, чтобы определить, что вводить в какой параметр. – biziclop