2

特定のインスタンスのすべてのインターフェイスを実装し、すべての呼び出しをそのインスタンスに転送する Byte Buddy を使用してクラスをセットアップしようとしています。これまでのコードは次のとおりです。

import static net.bytebuddy.implementation.Forwarding.to;

static Class<?> save (state) {
  return stream (state.getClass ().getMethods ())
    .filter (m -> isPublic (m.getModifiers ()))
    .reduce ((Builder<?>) new ByteBuddy ().subclass (Object.class)
      .implement (state.getClass ().getInterfaces ()),
             (b, m) -> {
               System.out.println ("Setting up method " + m.getName ());
               return b.define (new ForLoadedMethod (m))
                 .intercept (to (state));
              }, (x, y) -> {
                throw new UnsupportedOperationException ();
              }).make ().load (state.getClass ()
                .getClassLoader (), INJECTION).getLoaded ();
}

public static void main (String[] args) throws Throwable {
  System.out.println ("Saved: " + save (new Integer (1)).newInstance ().toString ());
}

これにより、次のような例外が発生します。

Exception in thread "main" java.lang.IllegalArgumentException: Cannot forward public boolean net.bytebuddy.renamed.java.lang.Object$ByteBuddy$rwGGy3NN.equals(java.lang.Object) to class java.lang.Integer
at net.bytebuddy.implementation.Forwarding$Appender.apply(Forwarding.java:337)
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)

Forwardingそれが機能するためにその下にメモを見ることができますが、それthe intercepted method must be defined on a super type of the given delegation targetが何を意味するのかわかりません。それが生成されたクラスをサブクラス化する必要があることを意味する場合、ターゲットがfinalクラスの場合はどうなりますか? これらの呼び出しを転送するカスタム実装を他にどのように作成できますか?

また、とにかくここにいるので、実装するジェネリック インターフェイス タイプを指定するにはどうすればよいですか? ロードさjava.lang.reflect.Typeれたものか、その場で作成したいものか?

4

1 に答える 1

1

転送の実装は、ターゲットが割り当て可能な型である必要があるリフレクション API と同様に機能します。Integer をサブクラス化しないため (それはとにかく不可能です)、転送委任は失敗します。

明示的に呼び出したいメソッドに名前を付けることができる MethodCall 委任を探していると思います。それはあなたのために働きますか?

最後に、ジェネリック型の実装は、バージョン 0.8 で計画されている機能です。私はすでに良い進歩を遂げており、2016 年 1 月までにリリース候補版を準備したいと考えています。また、フォワーディング委任についても再検討する予定です。署名ベースの呼び出しは実装がそれほど難しくないはずです。

于 2015-12-29T09:08:43.480 に答える