近期由于負責項目的一個模塊,該模塊下有很多分類,每個分類都有一個編碼code,這個值是作為一個參數攜帶過來的.但是每個code確實對應一個方法的.
code的值有很多個,自己又不想做ifelse或者switch判斷于是就狂搜資料,主要讓我發現利用java的反射機制可以完美的解決這個問題
測試代碼如下:(可以攜帶多個參數哦)
package?com.escs.xmlutils;
import?java.lang.reflect.Method;
public?class?Test?{
public?String?ceshi(){
System.out.println("1111111111111");
return?"success";
}
public?static?void?main(String[]?args)?throws?Exception?{
//里面寫自己的類名及路徑
Class>?c?=?Class.forName("com.escs.xmlutils.Test");
Object?obj?=?c.newInstance();
//第一個參數寫的是方法名,第二個\第三個\...寫的是方法參數列表中參數的類型
Method?method=c.getMethod("ceshi2",?String.class,int.class);
//invoke是執行該方法,并攜帶參數值
String?str2=?(String)?method.invoke(obj,?new?Object[]{"myname",4});
System.out.println(str2);
}
public??String?ceshi(String?str){
//for(int?j=0;j
System.out.println(str);
//}
return?str;
}
public??String?ceshi2(String?str,int?i){
for(int?j=0;j
System.out.println(str+"22222");
}
return?str;
}
}
這樣要是動態拼接方法名就更簡單了.比如,我的code值有100個,分別為1~100,我code方法分別為ReturnCodeList();這個時候我們把上面的方法抽取出來,返回我們需要的值就行了比如:
public?String?fanShe(String?methodName,String?className)?throws?ClassNotFoundException,?SecurityException,?NoSuchMethodException,?InstantiationException,?IllegalAccessException,?IllegalArgumentException,?InvocationTargetException{
//里面寫自己的類名及路徑
Class>?c?=?Class.forName(className);
Object?obj?=?c.newInstance();
//第一個參數寫的是方法名,第二個\第三個\...寫的是方法參數列表中參數的類型
Method?method=c.getMethod(methodName,?String.class,int.class);
//invoke是執行該方法,并攜帶參數值
String?str2=?(String)?method.invoke(obj,?new?Object[]{"myname",4});
return?str2;
}
當然在實際的需求中還是要根據項目的需要來自己抽取方法的.希望對大家有幫助.
想更深入了解java反射原理的可以參考:http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html