java cglib动态给原始对象添加新属性并赋值工具类
时间: 2024-05-15 17:20:04 浏览: 134
cglib动态生成java类
3星 · 编辑精心推荐
在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方法获取到了新属性的值。
阅读全文