1. 程式人生 > >Java反射應用(1)

Java反射應用(1)

Java反射應用
1:前臺到後臺資料自動裝入物件
2:poi中寫個通用poi工具類,作用是自動將引數裝入到到excel單元格中
在傳統的寫法就是需要將資料來源每列資料都一個個裝入到excel沒每個單元格中。

注意:這裡主要詳細講解第1個,因為poi通用工具類還需要優化,以後再開反射應用(2)詳細講解poi公共工具類。
一:前臺到後臺資料自動裝入物件。
1:原始前臺到後臺引數如何接收?
(1):一種就是根據前臺name取值,一個個對應的取值。
例如:

if((request.getParameter("CarNo"))!=null&&!"".equals
(request.getParameter("CarNo"))) { carNo=URLDecoder.decode((request.getParameter("CarNo")),"utf-8"); }
結論:這樣的話程式碼會很多很多,在很多業務比較複雜的公司他們表單動不動就說2,3十個的節奏,我想你在後臺會獲取值會寫的很悲傷的。
(2):另外種就是將前臺引數先提前處理轉成json字串,傳入到後臺在直接轉成物件
eg:後臺Bean b= (Bean)JSONObject.fromObject(前臺json串);
結論:第二種是我沒試驗過,不過流程很簡單,前臺對引數進行處理,後臺強轉成物件,這中寫法需要對前臺資料進行處理,大大加強了複雜度。
(3):通過反射將前臺引數裝入到後臺bean中。

這裡要詳細介紹的就是這種方法,技術點是攔截器,反射,列舉。下面奉上controller中:

Bean modelRequest=(Bean)request.getAttribute(“baseRequest”);//列舉方法/**
* 技術點:列舉類 Java基礎
* 功能:全域性變數
* @author Administrator
*
*/
public interface CommonConstant {
public enum CheckModels{
//登入
login(“/logIn”,”com.rokin.pojo.UsersPojo”),
//車源方管理(trucker) 管理我的司機 分頁查詢
getDrivers(“/getDrivers”,”com.rokin.pojo.trucker.DriversPojo”),
//車源方管理(trucker) 管理我的司機 新增
saveDrivers(“/saveDrivers”,”com.rokin.pojo.trucker.DriversPojo”),
//車源方管理(trucker) 管理我的司機 匯出(先查詢出資料在匯出)
OutDriverExcelAction(“/OutDriverExcelAction”,”com.rokin.pojo.trucker.DriversPojo”),

//車源方管理(trucker) 管理我的車輛 分頁查詢
getMyVehicles(“/getMyVehicles”,”com.rokin.pojo.trucker.BasePagePojo”),
;
private String servlet;
private String object;

private CheckModels(String servlet,String object) {
this.servlet = servlet;
this.object = object;
}

public String getServlet(){
return this.servlet;
}

public String getObject(){
return object;
}

public static String getObject(String servlet){
if(servlet==null||”“.equals(servlet)){
return null;
}
for(CheckModels model:CheckModels.values()){
if(model.getServlet().equals(servlet)){
return model.getObject();
}
}
return null;
}
}
//這裡是攔截器

public class RequestInterceptor implements HandlerInterceptor {

@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub

}

@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub

}

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object object) throws Exception {
// TODO Auto-generated method stub
System.out.println(“進入攔截器”);
String servletPath = request.getServletPath();
LogUtils.logger().info(“servletPath:”+servletPath);
String modelName = CommonConstant.CheckModels.getObject(servletPath);
LogUtils.logger().info(“modelName:”+modelName);
if(!StringUtils.isEmpty(modelName)){
Object baseRequest = ReflectPojo.reflectModel(modelName, request);
request.setAttribute(“baseRequest”, baseRequest);
}
return true;
}
這個是反射類

public class ReflectPojo {
public static Object reflectModel(String className,HttpServletRequest request){
try {
Class<?> model = Class.forName(className);
Object object = model.newInstance();
Field[] fields = model.getDeclaredFields();

/*Class<?>  Superclass=model.getSuperclass();
Object object2 = Superclass.newInstance();
Field[] fields2=Superclass.getDeclaredFields();*/
LogUtils.logger().info("model:"+model);  
LogUtils.logger().info("object:"+object); 
LogUtils.logger().info("fields:"+fields); 
for(Field field:fields){
String key = field.getName();
String type = field.getType().getSimpleName();
String value = request.getParameter(key);

PropertyDescriptor pd = new PropertyDescriptor(key, model);
Method method = pd.getWriteMethod();
LogUtils.logger().info("key:"+key);
LogUtils.logger().info("type:"+type);
LogUtils.logger().info("value:"+value);
LogUtils.logger().info("pd:"+pd);
LogUtils.logger().info("method:"+method);
/*if("Integer".equals(type)){
//int
method.invoke(object, CustomStringUtils.safeInteger(value));
}else if("Double".equals(type)){
method.invoke(object, CustomStringUtils.safeDouble(value));
}else {
method.invoke(object, value);
}*/
invokeObject(object, value, method, type);
System.out.println(key+"----->"+value);
//System.out.println(field.getType().getSimpleName());
}
return object;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void invokeObject(Object object,String value,Method method,String type){
try {
if("Integer".equals(type)){
//int
method.invoke(object, CustomStringUtils.safeInteger(value));
}else if("Double".equals(type)){
method.invoke(object, CustomStringUtils.safeDouble(value));
}else {
method.invoke(object, value);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
reflectModel(null,null);
}
}

件主要是這3個,複製過去後需要自己在配置檔案中配置攔截器喲 這裡就不貼程式碼了,自行解決吧。
使用這種方法在面對前臺引數很多的情況下很好用,只需要我們編寫對應bean和在列舉介面中編寫對應bean與路徑關係,然後我們就可以在controller中獲取baseRequest 就可以愉快的進行業務邏輯處理不用關係前臺引數有沒有呀,一個個set的,一個個獲取的煩心事了。