Java 使用ByteBuddy代理没有空构造函数的类
有没有办法使用ByteBuddy为没有空构造函数的类创建代理 其思想是为给定的具体类型创建一个代理,然后将所有方法重定向到处理程序 此测试展示了为没有空构造函数的clas创建代理的场景,并抛出Java 使用ByteBuddy代理没有空构造函数的类,java,byte-buddy,dynamic-proxy,Java,Byte Buddy,Dynamic Proxy,有没有办法使用ByteBuddy为没有空构造函数的类创建代理 其思想是为给定的具体类型创建一个代理,然后将所有方法重定向到处理程序 此测试展示了为没有空构造函数的clas创建代理的场景,并抛出java.lang.NoSuchMethodException @Test public void testProxyCreation_NoDefaultConstructor() throws InstantiationException, IllegalAccessException { //
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!"));
}
调用子类(FooEntity.class)
意味着Byte Buddy隐式地模仿了超类定义的所有构造函数。您可以添加一个自定义的ConstructorStrategy
作为第二个参数来更改此行为
然而,JVM要求任何构造函数最终调用超级构造函数,而您的代理类只提供一个带有单个构造函数的构造函数。根据您的代码,只需提供一个默认参数即可创建代理:
FooEntity newInstance = (FooEntity) dynamicType
.getConstuctor(String.class)
.newInstance(null);
然后将该字段设置为
null
。或者,您可以使用类似Objensis的库实例化类,该库使用JVM内部构件创建实例,而无需任何构造函数调用。这里的代码只是示例。在实际产品中,代理创建是在编译时不知道代理对象的类的工厂中完成的。我期望像objeness这样的东西,实际上我不想调用超级构造函数。哦,我不知道objeness可以和ByteBuddy一起使用。谢谢,问题解决了。对于下一个版本,我确实添加了一个构造函数策略,只要构造函数没有副作用,就可以解决这个问题。
FooEntity newInstance = (FooEntity) dynamicType
.getConstuctor(String.class)
.newInstance(null);