gpt4 book ai didi

java - 使用 ByteBuddy 的没有空构造函数的类的代理

转载 作者:行者123 更新时间:2023-12-02 11:42:33 31 4
gpt4 key购买 nike

有没有办法使用 ByteBuddy 为没有空构造函数的类创建代理?

这个想法是为给定的具体类型创建一个代理,然后将所有方法重定向到处理程序。

此测试展示了为没有空构造函数的类创建代理的场景,它会抛出 java.lang.NoSuchMethodException

@Test
public void testProxyCreation_NoDefaultConstructor() throws InstantiationException, IllegalAccessException {

// setup

// exercise
Class<?> dynamicType = new ByteBuddy() //
.subclass(FooEntity.class) //
.method(ElementMatchers.named("toString")) //
.intercept(FixedValue.value("Hello World!")) //
.make().load(getClass().getClassLoader()).getLoaded();

// verify
FooEntity newInstance = (FooEntity) dynamicType.newInstance();
Assert.assertThat(newInstance.toString(), Matchers.is("Hello World!"));
}

实体:

public class FooEntity {

private String value;

public FooEntity(String value) {
this.value = value;
}

public String getValue() {
return this.value;
}

public void setValue(String value) {
this.value = value;
}
}

最佳答案

您调用subclass(FooEntity.class)意味着Byte Buddy隐式模仿父类(super class)定义的所有构造函数。您可以添加自定义 ConstructorStrategy 作为第二个参数来更改此行为。

但是,JVM 要求任何构造函数最终都调用 super 构造函数,而您的代理类仅提供具有单个构造函数的 super 构造函数。根据您的代码,您只需提供默认参数即可创建代理:

FooEntity newInstance = (FooEntity) dynamicType
.getConstuctor(String.class)
.newInstance(null);

然后将该字段设置为 null。或者,您可以使用像 Objenesis 这样的库来实例化类,该库使用 JVM 内部结构来创建实例,而无需任何构造函数调用。

关于java - 使用 ByteBuddy 的没有空构造函数的类的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48446326/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com