私は他の人からいくつかのByteBuddyコードを見ています。彼はByteBuddyを使用してランタイムサブクラスを生成し、実行時の管理コードを特定のオブジェクトに実装するためのプロキシとして使用されます。私は、私は生成されたクラスを再利用(及び機能のすべての呼び出しのためにそれを再生しない)ことができ、新たな定義されたフィールド_core
を使用したいラムダに直接core
オブジェクトを結合しないためにByteBuddy:クラスの構築中にインターセプトで新しい定義フィールドを使用します。
Class<? extends T> newSubClass = new ByteBuddy(ClassFileVersion.ofThisVm())
.subclass(classType)
.defineField("_core", Object.class, Visibility.PUBLIC) //<---
.method(ElementMatchers.isDeclaredBy(classType))
.intercept(InvocationHandlerAdapter.of((proxy, method, m_args) -> {
//TODO: Need to replace core with _core as core is a function argument and will make it bound
return proxyHandler(core, method, m_args); //<--
}))
.make()
.load(roleType.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
T proxy = ReflectionHelper.newInstance(newSubClass, args);
newSubClass.getField("_core").set(proxy, core);
。 これを達成する方法はありますか?
ありがとうございます。
ヒントw.r.tをお寄せいただきありがとうございます。キャッシング。私は 'WeakHashMap、Class >>' elseを使ったでしょう。 –
lschuetze
値がキーのサブクラスであり、それを強く参照するため、これは機能しません。むしろ、これを回避する 'TypeCache'を使用して、値を弱く参照することもできます。 –
'_core'に格納されている呼び出しハンドラに委譲したくないのですか?この場合、' MethodDelegation'実装を見てください。このクラスでは、 '@FieldValue(" _ core ")アノテーション私の更新された答えを見てください。 –