快捷构造大对象

该工具类旨在解决Java中构建和操作具有大量字段和嵌套对象时的复杂性问题。通过提供set和get方法支持链式调用,可以方便地设置和获取对象的深层字段,包括ArrayList类型的字段。此外,还提供了add方法来向ArrayList字段添加元素。工具利用反射机制动态处理字段,简化了代码并提高了可读性。
摘要由CSDN通过智能技术生成

当对象的字段非常多, 字段类型又是对象, 对象里面还是对象, 构造一个这样的对象简直痛苦, 又臭又长的代码写一大堆, 写完了逻辑混乱看不懂, 相信这个工具会起到作用

使用

  1. 将要操作的对象放入工具, 创建实体
  2. 使用set方法, 用于设置对象字段的内容, 与对象内部的set方法不同的是, 他支持链式串联
  3. 使用get方法获取对应的对象字段的内容, 与set是相对应的, 同样支持链式串联
  4. 调用getObject方法获取修改完成的对象, 或者也可以用创建实体时丢进去的变量
  5. 如果对象的字段是个ArrayList, 则可以使用[i]的方式set或者get数据, 当然支持链式串联

在这里插入图片描述

结果

package com.dome.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * 用于便捷构造对象
 */
public class BuildObject<T> {

    private final T object;

    public BuildObject(T object) {
        this.object = object;
    }

    public T getObject() {
        return object;
    }

    public void set(String names, Object value) {
        if (names != null && names.length() > 0 && value != null) {
            String[] split = names.split("\\.");
            int lsat = split.length - 1;
            Object obj = object;
            for (int i = 0; i < split.length; i++) {
                String name = split[i];
                if (i == lsat) {
                    setObject(obj, name, value);
                }else {
                    if (name.contains("[")) {
                        String[] split1 = name.split("\\[");
                        name = split1[0];
                        int index = Integer.parseInt(split1[1].replaceAll("]", ""));
                        Object object = getObject(obj, name);
                        if (object == null) {
                            obj = generateObject(obj, name);
                        } else {
                            obj = object;
                        }
                        obj = ((ArrayList)obj).get(index);
                    }else {
                        Object object = getObject(obj, name);
                        if (object == null) {
                            obj = generateObject(obj, name);
                        } else {
                            obj = object;
                        }
                    }
                }
            }
        }
    }

    public void add(String names, Object value) {
        if (names != null && names.length() > 0 && value != null) {
            Object o = get(names);
            if (o != null) {
                ((ArrayList) o).add(value);
            }else {
                ArrayList<Object> objects = new ArrayList<>();
                objects.add(value);
                set(names, objects);
            }
        }
    }

    public Object get(String names) {
        return get(names, Object.class);
    }

    public <V> V get(String names, Class<V> entityClass) {
        if (names != null && names.length() > 0 ) {
            String[] split = names.split("\\.");
            int lsat = split.length - 1;
            Object obj = object;
            for (int i = 0; i < split.length; i++) {
                String name = split[i];
                if (i == lsat) {
                    Object object = getObject(obj, name);
                    if (object == null) {
                        return null;
                    }else {
                        return (V) object;
                    }
                }else {
                    if (name.contains("[")) {
                        String[] split1 = name.split("\\[");
                        name = split1[0];
                        Integer index = Integer.valueOf(split1[1].replaceAll("]", ""));
                        Object object = getObject(obj, name);
                        if (object == null) {
                            obj = generateObject(obj, name);
                        } else {
                            obj = object;
                        }
                        obj = ((ArrayList)obj).get(index);
                    }else {
                        Object object = getObject(obj, name);
                        if (object == null) {
                            obj = generateObject(obj, name);
                        } else {
                            obj = object;
                        }
                    }
                }
            }
        }
        return null;
    }

    private void setObject(Object source, String name, Object value) {
        String methodName = bigHump(name, "set");
        try {
            Field field = getFieldByName(source, name);
            Class<?> cl = Class.forName(field.getType().getName());
            Method method = source.getClass().getDeclaredMethod(methodName, cl);
            method.invoke(source, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private Object getObject(Object source, String name) {
        Class<?> clazz = source.getClass();//获取对象的类型
        Object value = null;
        try {
            //获取 clazz 类型中的 propertyName 的属性描述器
            name = bigHump(name, "get");
            Method method = clazz.getDeclaredMethod(name);
            value = method.invoke(source);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return value;
    }

    private Object generateObject(Object source, String name) {
        Object o = null;
        try {
            Field field = getFieldByName(source, name);
            Class<?> cl = Class.forName(field.getType().getName());
            o = cl.newInstance();
            setObject(source, name, o);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return o;
    }

    private Field getFieldByName(Object source, String name) {
        try {
            // 获取字段
            Field[] fields = source.getClass().getDeclaredFields();
            for (Field field : fields) {
                if (field.getName().equals(name)) {
                    return field;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private String bigHump(String name, String prefix) {
        return prefix + name.substring(0, 1).toUpperCase() + name.substring(1);
    }
    private String bigHump(String name) {
        return bigHump(name, "");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值