使用bytebuddy在java对象上动态注入字段

tquggr8v  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(467)

我有一段代码,我需要它在运行时注入字段:

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来实现这一点?如果不是直接的(即使只有一个克隆对象),当这些字段可以注入到对象中时,可以做些什么呢?过程是什么?
测试实体.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;
}
f8rj6qna

f8rj6qna1#

您需要定义一个新类来定义字段。您可以通过 new ByteBuddy().subclass(...) 或使用 new ByteBuddy().rebase(...) 复制现有类并将其重命名,以防不存在可分配性问题。可以使用 defineField 应用程序编程接口。

相关问题