使用 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
以创建(覆盖)访问字段的方法。
另一方面,在我看来,您更应该看看 MethodHandle
s,它可以像任何 Java 字节代码一样快速访问字段值。我认为解析方法句柄比创建 class.
需要更少的资源
我正在使用 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
以创建(覆盖)访问字段的方法。
另一方面,在我看来,您更应该看看 MethodHandle
s,它可以像任何 Java 字节代码一样快速访问字段值。我认为解析方法句柄比创建 class.