Java 动态创建Bean添加新属性工具类

一、工具类

/**
 * 为 bean 动态条件新属性
 */
public class BeanPropUtil {
    /**
     * 为 bean 动态条件新属性
     * @param object 需要添加属性的对象
     * @param addProperties 需要添加的属性以及值
     * @return
     */
    public static Object addProperties(Object object,Map<String, Object> addProperties) {
        Map<String, Class> propertyMap = new HashMap();
        addProperties.forEach((k, v) -> {
            propertyMap.put(k, v.getClass());
        });
        Object target = generateBean(object.getClass(), propertyMap);
        BeanMap beanMap = new BeanMap(target);
        addProperties.forEach((k, v) -> {
            beanMap.put(k, v);
        });
        BeanUtils.copyBeanProp(target, object);
        return target;
    }

    /**
     * 创建一个以 superclass 为父类,包含 propertyMap 中定义的属性的 bean
     * @param superclass 父类 Class
     * @param propertyMap 属性名称与属性值类型
     * @return
     */
    private static Object generateBean(Class superclass, Map<String, Class> propertyMap) {
        BeanGenerator generator = new BeanGenerator();
        if (null != superclass) {
            generator.setSuperclass(superclass);
        }

        BeanGenerator.addProperties(generator, propertyMap);
        return generator.create();
    }


}

二、测试

Address address = new Address();
address.setCountry("c1");
address.setCity("c1");

Map<String, Object> addProperties = new HashMap();
addProperties.put("codeName","测试");
Object object = BeanPropUtil.addProperties(address,addProperties);
System.out.println(JSON.toJSONString(object));
{"city":"c1","codeName":"测试","country":"c1"}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,使用CGLIB动态代理可以在运行时动态地创建类和对象。通过动态代理,可以为原始对象添加属性并为其赋值。下面是一个使用CGLIB动态代理实现动态添加属性工具类示例: ``` import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import net.sf.cglib.beans.BeanGenerator; import net.sf.cglib.beans.BeanMap; public class DynamicBeanUtil { /** * 创建动态Bean * * @param propertyMap * 属性集合 * @return Object 动态生成的Bean * @throws Exception */ public static Object createBean(Map<String, Class<?>> propertyMap) throws Exception { BeanGenerator generator = new BeanGenerator(); for (String key : propertyMap.keySet()) { generator.addProperty(key, propertyMap.get(key)); } return generator.create(); } /** * 给动态Bean的属性赋值 * * @param bean * 动态Bean * @param propertyMap * 属性集合 * @throws Exception */ public static void setBeanValue(Object bean, Map<String, Object> propertyMap) throws Exception { BeanMap beanMap = BeanMap.create(bean); for (String key : propertyMap.keySet()) { beanMap.put(key, propertyMap.get(key)); } } /** * 获取动态Bean的属性值 * * @param bean * 动态Bean * @param propertyName * 属性名 * @return Object 属性值 * @throws Exception */ public static Object getBeanValue(Object bean, String propertyName) throws Exception { BeanMap beanMap = BeanMap.create(bean); PropertyDescriptor descriptor = beanMap.getPropertyDescriptor(propertyName); Method getter = descriptor.getReadMethod(); return getter.invoke(bean); } /** * 获取动态Bean的所有属性值 * * @param bean * 动态Bean * @return Map<String, Object> 属性值集合 */ public static Map<String, Object> getBeanValues(Object bean) { Map<String, Object> values = new HashMap<String, Object>(); BeanMap beanMap = BeanMap.create(bean); for (Object key : beanMap.keySet()) { values.put(key.toString(), beanMap.get(key)); } return values; } /** * 给原始对象动态添加属性并赋值 * * @param obj * 原始对象 * @param propertyName * 属性名 * @param value * 属性值 * @throws Exception */ public static void addProperty(Object obj, String propertyName, Object value) throws Exception { Class<?> clazz = obj.getClass(); Field field = clazz.getDeclaredField(propertyName); field.setAccessible(true); // 获取原始对象的属性值集合 Map<String, Object> values = getBeanValues(obj); // 创建属性值集合,并将属性添加到集合中 Map<String, Class<?>> propertyMap = new HashMap<String, Class<?>>(values.size() + 1); for (String key : values.keySet()) { propertyMap.put(key, values.get(key).getClass()); } propertyMap.put(propertyName, value.getClass()); // 创建的动态Bean并赋值 Object bean = createBean(propertyMap); setBeanValue(bean, values); setBeanValue(bean, new HashMap<String, Object>() { { put(propertyName, value); } }); // 将动态Bean的属性值赋给原始对象 field.set(obj, beanMap.get(propertyName)); } } ``` 使用示例: ``` public class Person { private String name; private int age; // 省略getter和setter方法 } // 创建原始对象 Person p = new Person(); p.setName("Tom"); p.setAge(20); // 给原始对象动态添加属性并赋值 DynamicBeanUtil.addProperty(p, "gender", "male"); // 获取属性的值 System.out.println(p.getGender()); // 输出:male ``` 在上面的示例中,我们使用了DynamicBeanUtil工具类给原始对象Person动态添加属性gender,并为其赋值为male。最后,我们通过调用Person的getter方法获取到了属性的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值