使用 ByteBuddy 生成在运行时访问动态字段(参数化类型)的 class

Generating a class that access a dynamic field (of a parameterized type) at runtime with ByteBuddy

我正在使用 Java 泛型,我正在尝试尽可能避免反射。为此,我发现 byte-buddy 可以帮助我。但是,我想知道我是否可以使用 ByteBuddy 创建一个 class(抽象 class 的子 class),这样我就可以在不进行反射的情况下访问参数化类型的特定属性。这样的抽象 class 看起来像这样:

public abstract class AbstractClassTest<V extends Serializable, T extends AbstractEntity> {
    
   public boolean test( T entity ) {
       V value = getValue(entity);
       return value != null;
   }

   public abstract V getValue( T entity );
}

一个实体看起来像这样:

public class ConcreteEntity extends AbstractEntity {

   public String fieldTest;

   public ConcreteEntity(){
       this.fieldTest = "TEST"
   }

   public String getFieldTest(){
       return this.fieldTest;
   }

}

换句话说,我希望我创建的 class 覆盖在 AbstractClassTest 上找到的 getValue() 方法。另一个限制是我不知道运行时具体的 AbstractEntity class 是什么,所以我不能引用具体类型(即,我不能明确引用 ConcreteEntity)。

另一方面,参数化类型 V 和属性名称(例如“fieldTest”)是已知的。这导致我以某种方式“告诉”ByteBuddy,在覆盖的“getValue”方法中我想读取 T 的给定属性。

这可能吗?如果没有,在 ByteBuddy 的范围内还有哪些其他选项可用?

感谢您的帮助。谢谢!

你可以创建这样一个class。查看 DSL 和 FieldAccessor 以创建(覆盖)访问字段的方法。

另一方面,在我看来,您更应该看看 MethodHandles,它可以像任何 Java 字节代码一样快速访问字段值。我认为解析方法句柄比创建 class.

需要更少的资源