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的,一个个获取的烦心事了。

猜你喜欢

转载自blog.csdn.net/qq_34735535/article/details/77746780