5

私はインターフェースを持っています、それがこのように見えるとしましょう。

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";

    }

}

}

このエラーが発生します

Exception in thread "main" java.lang.IllegalArgumentException: None of [] allows for delegation from public boolean java.lang.Object.equals(java.lang.Object)
at net.bytebuddy.implementation.bind.MethodDelegationBinder$Processor.process(MethodDelegationBinder.java:881)
at net.bytebuddy.implementation.MethodDelegation$Appender.apply(MethodDelegation.java:1218)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyBody(TypeWriter.java:510)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod.apply(TypeWriter.java:444)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForCreation.create(TypeWriter.java:3193)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1481)
at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:234)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$AbstractDelegatingBuilder.make(DynamicType.java:2177)
at com.meta.testbytebuddy.Runme.main(Runme.java:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

私は何を間違っていますか ++ ..複数のインターフェースを実装したい場合はどうすればよいですか?

コード生成の目的で ByteBuddy を使用しています。

4

1 に答える 1

4

MethodDelegation.to(Interceptor.class)問題は、インターセプター クラスが非静的メンバーのみを宣言している間に、インターセプターの静的メソッドに委譲していることです。インターセプター メソッドを宣言するかstatic、クラスではなくインスタンスに委譲することができます。前者の方が適していると思います。

ただし、これだけではまだ機能しません。インターセプターから型を返してObjectいると同時に、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";
  }
}
于 2016-01-08T08:06:45.980 に答える