往对象中动态插入字段
创建一个实体
public class AEntity {
private String name;
private String age;
}
public static void main(String[] args) throws Exception {
AEntity model = new AEntity();
Map newFieldMap = new HashMap<>();
newFieldMap.put("className", "1");
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get(model.getClass().getName());
// 给class新增属性
for (Object fieldName : newFieldMap.keySet()) {
// 字段类型
String fieldType = newFieldMap.get(fieldName).getClass().getName();
// 创建新字段
CtField ctField = new CtField(pool.get(fieldType), (String) fieldName, ctClass);
ctField.setModifiers(Modifier.PRIVATE);
ctClass.addField(ctField);
}
Loader classLoader = new Loader(pool);
//生成新的字节码
Class newClass = classLoader.loadClass(ctClass.getName());
//用新的字节码创建新的对象
Object newObject = newClass.newInstance();
// 设置原有属性的值
for (Field oldField : model.getClass().getDeclaredFields()) {
//跳过final属性,因为final属性无法修改
if (java.lang.reflect.Modifier.isFinal(oldField.getModifiers())) {
continue;
}
oldField.setAccessible(true);
Field newField = newClass.getDeclaredField(oldField.getName());
newField.setAccessible(true);
newField.set(newObject, oldField.get(model));
}
//设置新增属性的值
for (Object fieldName : newFieldMap.keySet()) {
Field field = newClass.getDeclaredField((String) fieldName);
field.setAccessible(true);
field.set(newObject, newFieldMap.get(fieldName));
}
for (Field field : newClass.getDeclaredFields()) {
field.setAccessible(true);
System.out.println(field.getName() + ":" + field.get(newObject));
}
}