# beanutils **Repository Path**: zbone/beanutils ## Basic Information - **Project Name**: beanutils - **Description**: 我们在实际开发的过程中,需要将几个Javabean对象,糅合成一个json对象,返回给前台,这时,就需要过滤数据。我们使用的commons-beanutils这个框架,于是,自己看了源码后,仿写了这个框架。于是,把这个框架贡献出来,供大家学习使用。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-03-05 - **Last Updated**: 2023-08-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # beanutils #### 介绍 我们在实际开发的过程中,需要将几个Javabean对象,糅合成一个json对象,返回给前台,这时,就需要过滤数据。 我们使用的commons-beanutils这个框架,于是,自己看了源码后,仿写了这个框架。于是,把这个框架贡献出来, 供大家学习使用。详细介绍,请参考我的博客:https://segmentfault.com/write?draftId=1220000018204853 #### 软件架构 1. 这里使用了日志文件,因而,配置文件放在资源包下,即resources中 2、核心方法是PropertyUtil这个类,这个类的设计思想如下 * 如果javabean的对象属性类型不是用户自定义的类型,我们根据反射调用get方法拿到属性的值 * 如果javabean的对象属性类型是用户自定义的类型,我们利用递归重新调用改方法,直到出现遇见上面的条件 ```$xslt clazz = bean.getClass(); if (props.indexOf(".") != -1) { methodName = MethodHelper.propsToGetMethod(props.substring(0, props.indexOf("."))); Method method = clazz.getDeclaredMethod(methodName); Object obj = method.invoke(bean); return getProperty(obj, props.substring(props.indexOf(".") + 1)); } Field field = clazz.getDeclaredField(props); typeName = field.getType().getName(); if (typeName.equalsIgnoreCase("boolean")) { field.setAccessible(true); return field.getBoolean(bean); } methodName = MethodHelper.propsToGetMethod(props); Method method = clazz.getDeclaredMethod(methodName); return method.invoke(bean); ``` 3. 封装了JsonUtil的方法,将过滤后的数据填充到JsonObject中,以json的格式输出到前端 ```$xslt /** * Created By zby on 9:40 2019/2/13 * 模拟框架中的数据 * * @param object 参数对象 * @param props String类型的变长数组,比如{"id:projectId", "mobile",...} * 前半部分是javabean的属性名,后半部分是返回到给客户端的参数名 */ public static JSONObject propsFilter(Object object, String... props) { //【1】判断对象和变长数组的是否为空,以及变长数组的长度是否为0 boolean isNull = object == null || (null == props && props.length == 0); if (isNull) { logger.warn("参数为空object=" + object + "props=" + props); return null; } JSONObject jsonObject = new JSONObject(); for (String prop : props) { //【2】再判断对象不为空,或者长度不为0 if (prop == null && prop.length() == 0) { logger.warn("参数为空prop= " + prop); throw new RuntimeException("参数为空prop=" + prop); } Object o = null; String[] namePair = StringUtils.split(prop, ":"); try { o = PropertyUtil.getProperty(object, namePair[0]); } catch (Exception e) { logger.warn("类" + object.getClass() + ",属性" + namePair[0] + "不存在"); } String key = namePair.length <= 1 ? namePair[0] : namePair[1]; if (o instanceof Date) jsonObject.put(key, DateUtil.simpleFormate((Date) o)); else if (o instanceof BigDecimal) jsonObject.put(key, CommonUtil.toFiexd((BigDecimal) o, 2)); else if (o instanceof TitleEnum) jsonObject.put(key, CommonUtil.builderEnum((TitleEnum) o)); else jsonObject.put(key, o); } return jsonObject; } ``` #### 安装教程 该项目是基于idea的Java语言开发的框架,所有,确保电脑已经安装了idea和jdk等。 #### 测试说明 ``` @Test public void test(){ Address address = new Address(); address.setAddressTag(AddressTagEnum.ADDRESS_TAG_COMPANY); address.setArea("杭州市...."); address.setConsignee("zby"); User user = new User(); user.setHobby(HobbyEnum.HOBBY_DANCING); user.setGender("男"); user.setUserName("蒋三"); OrderSnapshot orderSnapshot = new OrderSnapshot(); orderSnapshot.setAddress(address); orderSnapshot.setId(1L); orderSnapshot.setName("复读机"); orderSnapshot.setOrderNo(Long.valueOf(System.currentTimeMillis()).toString() + "1L"); orderSnapshot.setUser(user); String[] json = {"address.consignee:consignee","user.hobby:hobby","address.addressTag:addressTag", "address.area:area","address.consignee:consignee","user.userName:userName"}; System.out.println(JsonUtil.propsFilter(orderSnapshot, json)); } 结果是: { "area":"杭州市....", "consignee":"zby", "addressTag":{ "value":"公司", "key":"ADDRESS_TAG_COMPANY" }, "userName":"蒋三", "hobby":{ "value":"跳舞", "key":"HOBBY_DANCING" } } ```