使用 ByteBuddy 在 Java 个对象上动态注入字段
Dynamically inject fields on Java objects using ByteBuddy
我有这段代码,我需要(它)在运行时注入字段:
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
TestEntity entity = (TestEntity) source;
entity.getPropertyMap().forEach((fieldName, fieldValue) -> {
// "fieldName" is an arbritary name not known at compile time
injectFieldTo(source, fieldName, fieldValue);
});
entity.setPropertyMap(null);
super.marshal(source, writer, context);
}
有没有办法在 Java 中使用 ByteBuddy 做到这一点?如果不是直接(即使只有一个克隆对象),那么可以将这些字段注入到对象中,可以做什么?流程是什么?
TestEntity.java
public class TestEntity implements Serializable {
private String entityType;
private String entityId;
private String dateCreated;
private String dateUpdated;
private Boolean publicRead;
private Boolean publicWrite;
private Map<String, Object> propertyMap;
}
您需要定义一个新的 class 来定义字段。您可以通过 new ByteBuddy().subclass(...)
子class 现有的 class 或使用 new ByteBuddy().rebase(...)
复制现有的 class 并重命名它,以防可分配性不是问题。您使用 defineField
API.
定义新字段
我有这段代码,我需要(它)在运行时注入字段:
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
TestEntity entity = (TestEntity) source;
entity.getPropertyMap().forEach((fieldName, fieldValue) -> {
// "fieldName" is an arbritary name not known at compile time
injectFieldTo(source, fieldName, fieldValue);
});
entity.setPropertyMap(null);
super.marshal(source, writer, context);
}
有没有办法在 Java 中使用 ByteBuddy 做到这一点?如果不是直接(即使只有一个克隆对象),那么可以将这些字段注入到对象中,可以做什么?流程是什么?
TestEntity.java
public class TestEntity implements Serializable {
private String entityType;
private String entityId;
private String dateCreated;
private String dateUpdated;
private Boolean publicRead;
private Boolean publicWrite;
private Map<String, Object> propertyMap;
}
您需要定义一个新的 class 来定义字段。您可以通过 new ByteBuddy().subclass(...)
子class 现有的 class 或使用 new ByteBuddy().rebase(...)
复制现有的 class 并重命名它,以防可分配性不是问题。您使用 defineField
API.