Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.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
如何使用Byte Buddy从接口构建Java类的具体实现?_Java_Bytecode_Byte Buddy - Fatal编程技术网

如何使用Byte Buddy从接口构建Java类的具体实现?

如何使用Byte Buddy从接口构建Java类的具体实现?,java,bytecode,byte-buddy,Java,Bytecode,Byte Buddy,我有一个界面,假设它看起来像这样 public interface TestObject { String getString(); Long getLong(); } 我想实际使用ByteBuddy构建这个对象的具体实现 这是我试过的 public class Runme { public static void main(String[] args) { ByteBuddy bb = new ByteBuddy(); Class

我有一个界面,假设它看起来像这样

public interface TestObject {
    String getString();

    Long getLong();
}
我想实际使用ByteBuddy构建这个对象的具体实现

这是我试过的

public class Runme {

    public static void main(String[] args) {
        ByteBuddy bb = new ByteBuddy();

        Class<?> clz = bb
                .subclass(TestObject.class)
      .method(any()).intercept(MethodDelegation.to(Interceptor.class))
            .make()
            .load(Object.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
            .getLoaded();

    try {
        Object test = clz.newInstance();

    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

}

public class Interceptor {

    public Object intercept(@Origin String method, @AllArguments Object[] args) throws Throwable {
        System.out.println("I have intercepted a call");

        return "Hello";

    }

}
我做错了什么++。。如果我想实现多个接口怎么办


我使用ByteBuddy来生成代码。

问题是您正在通过
MethodDelegation.to(interceptor.class)
向拦截器的静态方法授权,而拦截器类只声明了非静态成员。您可以将拦截器方法声明为
静态
,也可以委托给实例而不是类。我认为前者更合适

然而,单凭这一点仍然行不通。您正在从侦听器返回一个
对象
类型,同时正在侦听
any()
方法。这包括
TestObject
接口的方法,也包括隐式超类
Object
声明的方法。您可以按如下方式定义拦截器以使类编译,但Byte Buddy会将返回类型强制转换为每个方法的返回类型,这将导致
ClassCastException

public class Interceptor {
  @RuntimeType
  public static Object intercept(@Origin String method, @AllArguments Object[] args) {
    System.out.println("I have intercepted a call");
    return "Hello";
  }
}

非常感谢,还有一个问题,如何实现多个接口?您可以看看API文档:动态类型生成器有一个实现方法。感谢您的澄清。遇到类似的问题,通过更改:
.intercept(MethodDelegation.to(myRecycleServiceAdapterInterceptor.class))
.intercept(MethodDelegation.to(new myRecycleServiceAdapterInterceptor())
;)
public class Interceptor {
  @RuntimeType
  public static Object intercept(@Origin String method, @AllArguments Object[] args) {
    System.out.println("I have intercepted a call");
    return "Hello";
  }
}