如何使用ByteBuddy创建类,为每个实例初始化私有字段?
解决方案:用ByteBuddy为子类实例初始化私有字段
你需要通过ByteBuddy拦截子类的构造器,在构造过程中为私有字段foo初始化新的Foo实例。这样每个子类实例创建时都会自动完成字段赋值,且只需要生成一次子类。
替换LINE X的代码如下:
.constructor(any()) .intercept(ConstructorCall.DEFAULT.andThen(FieldAccessor.ofField("foo").setsValue(new Foo())))
完整的main方法代码:
public static void main(String[] args) throws Exception{ Class<? extends Bar> clazz = new ByteBuddy() .subclass(Bar.class) .constructor(any()) .intercept(ConstructorCall.DEFAULT.andThen(FieldAccessor.ofField("foo").setsValue(new Foo()))) .make() .load(ByteBuddyTest.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) .getLoaded(); var bar1 = clazz.getDeclaredConstructor().newInstance(); System.out.println(bar1.getFoo()); // 输出非null的Foo实例 var bar2 = clazz.getDeclaredConstructor().newInstance(); System.out.println(bar2.getFoo()); // 输出另一个新的Foo实例 System.out.println(bar1.getFoo() != bar2.getFoo()); // 打印true,说明是不同实例 }
代码说明:
constructor(any()):匹配父类Bar的所有构造器(这里是默认无参构造)ConstructorCall.DEFAULT:确保先调用父类的构造逻辑,保证实例初始化的正确性FieldAccessor.ofField("foo").setsValue(new Foo()):在父类构造执行完成后,为当前实例的私有字段foo赋值一个新的Foo对象- 这种方式只需要生成一次子类,后续每次创建实例时都会自动执行字段初始化逻辑,满足你创建多个
Bar实例的需求
内容的提问来源于stack exchange,提问作者SilverCube
相关产品推荐
相关产品推荐

