特定のインスタンスのすべてのインターフェイスを実装し、すべての呼び出しをそのインスタンスに転送する 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
れたものか、その場で作成したいものか?