Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ByteBuddy代理没有空构造函数的类_Java_Byte Buddy_Dynamic Proxy - Fatal编程技术网

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

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 { //

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

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

此测试展示了为没有空构造函数的clas创建代理的场景,并抛出
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);