java cglib 为原始对象添加新属性并赋值工具类
时间: 2024-05-15 20:19:47 浏览: 10
Java中的cglib库可以用于动态生成Java类,可以通过cglib为一个原始对象添加新属性并赋值。下面是一个简单的工具类,可以为一个对象添加新属性并赋值:
```java
import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.core.NamingPolicy;
import net.sf.cglib.core.Predicate;
import net.sf.cglib.core.Visibility;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
public class CglibUtils {
/**
* 为一个对象动态添加属性
*
* @param target 原始对象
* @param fieldName 属性名
* @param value 属性值
* @return 新对象,新对象包含原始对象的所有属性和新添加的属性
*/
public static Object addField(Object target, String fieldName, Object value) {
// 创建一个BeanGenerator对象,用于动态生成Java类
BeanGenerator generator = new BeanGenerator();
// 设置要生成的Java类的父类,即原始对象的类
generator.setSuperclass(target.getClass());
// 添加新属性,属性名为fieldName,属性值类型为value的类型
generator.addProperty(fieldName, value.getClass());
// 使用默认的命名策略生成类名
generator.setNamingPolicy(new NamingPolicy() {
@Override
public String getClassName(String s, String s1, Object o, Predicate predicate) {
return target.getClass().getSimpleName() + "$$" + fieldName + "$$" + o.hashCode();
}
});
// 创建新的Java类,并实例化对象
Object newObject = generator.create();
// 获取新对象的属性名和值,构造属性名和值的Map
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(fieldName, value);
for (java.beans.PropertyDescriptor property : java.beans.Introspector.getBeanInfo(newObject.getClass()).getPropertyDescriptors()) {
String propertyName = property.getName();
if (!"class".equals(propertyName)) {
try {
Object propertyValue = property.getReadMethod().invoke(target);
properties.put(propertyName, propertyValue);
} catch (Exception e) {
// ignore exception
}
}
}
// 使用BeanUtils的populate方法,将属性名和值的Map中的所有属性值赋值给新对象
try {
org.apache.commons.beanutils.BeanUtils.populate(newObject, properties);
} catch (Exception e) {
// ignore exception
}
return newObject;
}
}
```
使用示例:
```java
public class Main {
public static void main(String[] args) {
// 创建一个Person对象
Person person = new Person("张三", 18);
System.out.println("原始对象:" + person);
// 为Person对象添加新属性,并赋值
Object newObject = CglibUtils.addField(person, "email", "zhangsan@qq.com");
System.out.println("新对象:" + newObject);
}
}
```
输出结果:
```
原始对象:Person{name='张三', age=18}
新对象:Person$$email$$-2086562992@6d5380c2{name='张三', age=18, email='zhangsan@qq.com'}
```