利用java反射机制简化数据封装操作

本文介绍了一种使用Java反射机制自动填充Hibernate实体类的方法,通过一个实用工具类实现Struts2 Action与实体类之间的数据自动转移,大幅减少代码量。

你是否在用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()); } }

希望各位技术牛人多多指教,多多交流!!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值