你是否在用hibernate+spring+struts2(struts1)的时候经常要把页面表单中的数据封装到hibernate的实体类中去而写大量的代码呢?如果一个hibernate的实体类里面有几十个字段,那么你将写几十个下面这样的操作,你觉得那是在浪费你的才华吗?
Pojo p = new Pojo(); p.setName(this.getName()); p.setSex(this.getSex()); . . . hibernateDao.save(p);
其实这里可以很好的利用java的反射机制来自动为你完成这样的数据封装,大大的缩短简化你的代码,我们程序员的怎能花大量的时间来写
这样没技术含量的代码呢?但是往往项目中经常会有这样的需求,下面是我写的一个利用反射机制转移数据的类,就是简单的把struts2 action中的数据转移到我们的pojo中去的一个工具类,要求就是你的action种字段端的变量名要和pojo的一一对应,当然如果不想对应,也没关系的,可以利用配置文件,或者注解这些手法来达到你的目的,但是这会加大开发注入工具类的难度,其实我个人觉得没必要吧,呵呵!
也许你们在项目中已经这样解决了,或者有更好的解决方法(希望能分享),那么还没在项目中运用的,那么这将是你不错的选择,呵呵!
package computer.utils; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * 给实体类注入值 * * @author lazy_p * */ public final class RegisterEntity { /** * 将action中的值注入实体类entity * * @param entity * 实体类 * @param action * 封装了值的action * @return 实体类的对象 */ public static Object register(Object entity, Object action) { Class<?> actionClass = action.getClass(); Class<?> entityClass = entity.getClass(); Method[] actionMethods = actionClass.getDeclaredMethods(); for (Method method : actionMethods) { if (method.getModifiers() == Modifier.PRIVATE) continue; String methodName = method.getName(); if (methodName.startsWith("get")) { String entityMethod = "set" + methodName.substring(3); Method m = null; try { m = entityClass.getMethod(entityMethod, method .getReturnType()); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { System.err.println(e.getMessage()); continue; // 如果实体类没有对应的方法则抛出此异常后,将继续循环下一个方法 // e.printStackTrace(); } try { m.invoke(entity, method.invoke(action, null)); } catch (Exception e) { e.printStackTrace(); } } } return entity; } public static void main(String[] args) throws SecurityException, ClassNotFoundException { Class<?> cls = Class.forName("computer.pojo.Student"); try { Class<?> paramType = cls.getMethod("getName", null).getReturnType(); Method tmp = cls.getMethod("setName", paramType); System.out.println(tmp); } catch (NoSuchMethodException e) { e.printStackTrace(); } Method[] mm = cls.getDeclaredMethods(); Class<?> clss = cls.getSuperclass(); Method[] mmm = clss.getDeclaredMethods(); for (Method m : mm) System.out.println(m.getName()); for (Method m : mmm) System.out.println(m.getName()); } }
希望各位技术牛人多多指教,多多交流!!!!
本文介绍了一种使用Java反射机制自动填充Hibernate实体类的方法,通过一个实用工具类实现Struts2 Action与实体类之间的数据自动转移,大幅减少代码量。
220

被折叠的 条评论
为什么被折叠?



