使用java反射技术形式获取自定义bean父子节点树,为了拼凑bootstrap-tree 的json格式

封装的一个多种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);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值