背景:在像Spring這樣的幾個Java框架中,有可能使用注入參數值調用方法。一個很好的例子是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");
}
例如,當我想用類似的東西在自己的應用程序(包括可用的無彈簧) - 我結束了類似的東西(砍死一起):
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如何允許這樣的功能? Spring是否有適合最常用方法的大量method.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