封装的一个多种bean 格式的 递归获取 父子节点的类 适用形式 List<?> ?不管是什么bean 只要里面包含了子节点chilren(名称可随便) 利用java 反射技术实现 不懂请自行百度 what is class.newInstance() private 反射如何取 private 如何塞值,取值
List<DepartmentInfo> rvList = (List<DepartmentInfo>) Util.buildTreeByFormatter("取出来的size9集合", bean实例, "bean实例存储的children字段名称", "子节点id", "父节点ID", "父节点ID对应值"); /** * 构建树 使用 递归,使用自定义 对象 * * @param res 数据源 List<?> * @param os new 的?里的对象 * @param children_key ?类的 存储 children 集合 的名字 * @param id 当前结点 * @param pid 父节点 * @param pid_key 父节点的值 * @return */ public static Object buildTreeByFormatter(List<?> res, Object os, String children_key, String id, String pid, String pid_key) { Object rvObj = null; try { Class cls = os.getClass(); Object obj = cls.newInstance(); buildTree(res, obj, children_key, id, pid, pid_key); Field field = cls.getDeclaredField(children_key); rvObj = field.get(obj); } catch (Exception e) { logger.error(e); } return rvObj; } /** * 获得自定义 bean 的递归 * * @param res * @param os * @param field_key * @param id * @param pid * @param pid_key */ private static void buildTree(List<?> res, Object os, String field_key, String id, String pid, String pid_key) { List resList = new ArrayList<>(); resList.addAll(res); try { //获得传入的对象类 Class cls = os.getClass(); for (int i = 0; i < resList.size(); i++) { Object o = resList.get(i); //获得ID的值 Field idField = cls.getDeclaredField(id); idField.setAccessible(true); String idV = String.valueOf(idField.get(o)); //获得父ID的值 Field pidField = cls.getDeclaredField(pid); pidField.setAccessible(true); String pidV = String.valueOf(pidField.get(o)); if (pidV.equals(pid_key)) { Field arrayField = cls.getDeclaredField(field_key); List l = (List) arrayField.get(os); List n = new ArrayList<>(); n.add(resList.get(i)); if (l == null) { l = new ArrayList(); } l.addAll(n); arrayField.set(os, l); buildTree(resList, ((List) arrayField.get(os)).get(0), field_key, id, pid, idV); } } } catch (Exception e) { logger.error(e); } }