在java web 開發中,我們經常會遇到,從後台擷取前台的值,將擷取的值通過set方法賦值給實體,然後將實體存入資料庫中,有時候對於實體屬性多時,代碼量很大(其實都是那些set方法),所以針對這點,我們可以通過method反射機制,寫個通用的底層方法(對任何實體都有效),這樣一來,我們就不用再去一個一個set到實體中去。
public static Object ObjectMethod(Object obj,HttpServletRequest request){
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field:fields){
String md = "set"+StringUtils.capitalize(field.getName());
try {
Method method = obj.getClass().getDeclaredMethod(md, field.getType());
if("java.lang.String".equals(field.getType().getName())){
String value = request.getParameter(field.getName());
method.invoke(obj, value);
}else if("java.lang.Integer".equals(field.getType().getName())){
if(!"".equals(request.getParameter(field.getName()))&&request.getParameter(field.getName())!=null){
Integer value = Integer.valueOf(request.getParameter(field.getName()));
method.invoke(obj, value);
}
}else{//這裡判斷當實體中某個屬性為物件類型時,再一次去反射
Class c = Class.forName(field.getType().getName());//擷取屬性所對應的實體類
Object o =c.newInstance(); //new一個實體類
Field[] fs = o.getClass().getDeclaredFields();
for(Field f : fs){
if(f.getName().endsWith("id")){//需要命名規範
String set = "set"+StringUtils.capitalize(f.getName());
Method m = o.getClass().getDeclaredMethod(set, f.getType());
if("java.lang.Integer".equals(f.getType().getName())){
Integer value = Integer.valueOf(request.getParameter(field.getName()));
m.invoke(o, value);
method.invoke(obj, o);
}else if("java.lang.String".equals(field.getType().getName())){
String value = request.getParameter(field.getName());
m.invoke(o, value);
method.invoke(obj, o);
}//今後添加基礎類型
}
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (InstantiationException e) {
e.printStackTrace();
}
}
return obj;
}
以上兩篇文章,是對java Method反射機制的一個認識,其實,我們在java web開發中,所用到的架構,hibernate,spring等,都是通過java method反射機制去寫的,由於時間問題,我在這裡就不準備用java method的反射機制去類比 hibernate ,spring架構了,大家有興趣的可以去自己研究,如果有什麼問題,歡迎大家留言!