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
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、付费专栏及课程。

余额充值