DynaBean

DynaBean 收藏
DynaBean是BeanUtils里的宝贝之一。有了动态Bean,就不用写那么多VO出来了,特别那些只是为了和View交互而存在的bean,i hate Form Bean。
     DynaBean的用法很简单,特别是有了LazyBynaBean之后.

         DynaBean car = new LazyDynaBean();         car.set("carNo",1);         car.set("owner","张三");         out.print(car.get("carNo"));         看着像一个map,只不过多了反射的功能,所以支持那些使用反射来获取属性的场合。

         但是因为他没有car.getCarNo()这样的函数,只能用car.get("carNo"),所以也就不支持JSTL里面<c: out value="{car.carNo}">这样的语法,因为JSTL是默认转回car.getCarNo()的。
而且几经讨论,JSTL不支持 car.userFunction(),理由是不希望代码里有java代码:(

         因此,还是写<%=car.get("carNo")>好了,如果是陷在JSTL的一个循环结构里,就要用从pageContext里面把bean拿出来,
        又或者自己写的tag,幸亏也很简单,用BeanUtils.getProperty(bean,property)函数就可以了,
        又或者,用Velocity和Freemarker。

       最后,如果car.set("carNo",null),会得到一个莫名其妙的Object对象,如果要使它为Null,需要先定义他的类型。
       因此,对于可能为Null的列,需要用LazyClass定义类型,幸亏也很Lazy, 不可能为Null的值可以不管。

      LazyDynaClass lc = new LazyDynaClass();
      lc.add("owner",String.class); // 指定null converter String
      DynaBean car = new LazyDynaBean(lc);
      car.set("carNo",1);
      car.set("owner",null);


DynaProperty[] beanProperties = new DynaProperty[]{

    new DynaProperty("name", String.class),

    new DynaProperty("party", Party.class),

    new DynaProperty("votes", Long.class)

};

 

BasicDynaClass politicianClass =

    new BasicDynaClass("politician", BasicDynaBean.class, props);

 

DynaBean politician = politicianClass.newInstance( );

 

// Set the properties via DynaBean

politician.set( "name", "Tony Blair" );

politician.set( "party", Party.LABOUR );

politician.set( "votes", new Long( 50000000 ) );

一、DynaBean,DynaClass 与 DynaProperty
    DynaBean并不是Java中所定义的Bean,而是一种“假”的Bean。因为它并不是通过getXXX和setXXX方法,对XXX属性进行取值和设值的。它通过一个实现了DynaClass接口的类,帮助管理其所有的属性的类别,而自己则管理对XXX属性值的设定和获取。在设值的时候会通过与name对应的DynaProperty对象,检查赋值的类别是否正确。
    DynaProperty类描述的是DynaBean中所包含的属性的类型。DynaProperty类有三个属性:属性的名称:name,属性的名称;type,属性的类别;contentType,如果DynaProperty描述的是个容器对象(List或者Map),那么这个contentType就代表这个容器内元素的类别。这个类值得关注的地方是writeObject和readObject方法的实现。它会首先判断自己的type是否是一个primitive的类,如果是,则先写入true标志,再写入对应的primitive类的编号;否则写入false标志,再写入type。因为在调用readObject方法时,如果得出的是primitive类型,则type的值为XXX.TYPE而不是XXX.class。
    DynaClass 是一个接口,用来管理DynaBean中所有的DynaProperty属性。
 
二、BasiceDyanBean 与 BasicDynaClass
    BasiceDyanBean 实现自DynaBean接口。它包含一个实现了DynaClass接口的类的对象,和一个用来存放值的HashMap。这个HashMap的key与DynaClass中HashMap的key是一一对应的。
    BasicDynaClass 实现了DynaClass接口,以DynaProperty的name为key保存所有这些DynaProperty对象。它通过newInstance方法动态生成实现了DynaBean接口的类的对象;注意这个类是可以动态指定的,如果没有,那么就是默认的BasicDynaBean类。动态指定类是通过反射实现的,程序如下:
    //dynaBeanClass为任意的实现了DynaBean接口的类,constructorTypes为这个
    //类的构造方法所需要的参数的类型
    constructor = dynaBeanClass.getConstructor(constructorTypes);
    //constructorValues为构造方法的参数值,实际上它的值为当前的BasicDynaClass
     return ((DynaBean) constructor.newInstance(constructorValues));

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/beauty9235/archive/2007/06/16/1654254.aspx

logger.info("开始执行串岗报警移除入厂申请已过期且无新申请和合格培训承包商人员任务"); //todo 获取入厂申请信息到了有效期时间之后,未产生新的入厂申请和该围栏所属部门的培训考试合格信息的承包商人员的jeRbacDeptuserId,zyIds,names List<Map<String, Object>> userInfoList = new ArrayList<>(); HashMap<String, Object> userMap = new HashMap<>(); userMap.put("JE_RBAC_DEPTUSER_ID", "72644cfc2a4f47c6b4c531fd1fb2ac0f"); userMap.put("ZY_USER_ID", 32260); userMap.put("NAME", "崔哲辉"); userMap.put("DEPT_CODE", "900000141190"); userInfoList.add(userMap); // 将需要移除的人员信息转换为Map Map<String, Map<String, Object>> usersToRemove = new HashMap<>(); for (Map<String, Object> user : userInfoList) { usersToRemove.put((String) user.get("JE_RBAC_DEPTUSER_ID"), user); } //查询所有启用状态且已配置告警规则的人员围栏 List<DynaBean> fenceList = metaService.select(ConditionsWrapper.builder().table("POSITION_PERSONNEL_ALARM").eq("STATUS", 2).eq("IS_CONFIGURE", 1)); for (DynaBean dynaBean : fenceList) { //该围栏下的串岗告警规则 DynaBean alarmType4 = metaService.selectOne("POSITION_ALARM", ConditionsWrapper.builder().eq("TYPE", 4).eq("ALARM_ID", dynaBean.get("POSITION_PERSONNEL_ALARM_ID"))); if(alarmType4!=null){ String detail = alarmType4.getStr("DETAIL"); if(StringUtils.isNotEmpty(detail)){ try { // 解析DETAIL字段中的JSON数据 com.alibaba.fastjson2.JSONObject jsonDetail = JSON.parseObject(detail); List<String> names = jsonDetail.getJSONArray("staffName").toJavaList(String.class); List<Long> zyIds = jsonDetail.getJSONArray("entityIds").toJavaList(Long.class); List<String> jeRbacDeptuserIds = jsonDetail.getJSONArray("keys").toJavaList(String.class); // 标记需要移除的人员索引 List<Integer> indexesToRemove = new ArrayList<>(); // 遍历JSON中的人员信息,查找匹配的JE_RBAC_DEPTUSER_ID //todo 并且该人员的deptCode等于围栏的dynaBeandeptCode for (int i = 0; i < jeRbacDeptuserIds.size(); i++) { String userIdStr = jeRbacDeptuserIds.get(i); if (usersToRemove.containsKey(userIdStr)) { indexesToRemove.add(i); logger.info("找到需要移除的承包商人员: {}", usersToRemove.get(userIdStr).get("NAME")); } } // 从后往前移除,避免索引变化问题 for (int i = indexesToRemove.size() - 1; i >= 0; i--) { int index = indexesToRemove.get(i); names.remove(index); zyIds.remove(index); jeRbacDeptuserIds.remove(index); } // 更新JSON数据 jsonDetail.put("staffName", names); jsonDetail.put("entityIds", zyIds); jsonDetail.put("keys", jeRbacDeptuserIds); // 更新数据库中的DETAIL字段 alarmType4.set("DETAIL", jsonDetail.toJSONString()); logger.info("围栏{},串岗告警更新成功", dynaBean.getStr("ELECTRONIC_FENCE_NAME")); metaService.update(alarmType4); //调用真源->更新串岗告警规则 zyApiService.zyWarnTriggeUpdate(triggeJsonObject(alarmType4)); }catch (Exception e){ logger.error("解析围栏{}DETAIL字段中的JSON数据出错:", dynaBean.getStr("ELECTRONIC_FENCE_NAME"),e); } } } } logger.info("结束执行串岗报警移除入厂申请已过期且无新申请和合格培训承包商人员任务");修改 for (int i = 0; i < jeRbacDeptuserIds.size(); i++) { String userIdStr = jeRbacDeptuserIds.get(i); if (usersToRemove.containsKey(userIdStr)) { indexesToRemove.add(i); logger.info("找到需要移除的承包商人员: {}", usersToRemove.get(userIdStr).get("NAME")); } }
08-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值