我期待在從別人一些ByteBuddy代碼的過程中使用截獲新定義的字段。他使用ByteBuddy生成運行時子類,這些子類用作代理來實現其運行時的某些管理代碼到特定對象中。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);
爲了不core
對象直接結合進欲使用新定義的字段_core
所以可以重複使用生成的類(而不是重新生成它的函數的每個調用)拉姆達。 有沒有辦法做到這一點?
在此先感謝。
感謝提示w.r.t.緩存。我會使用'WeakHashMap,類>> else。 –
lschuetze
這不會工作,因爲該值是密鑰的子類並強烈引用它。而是使用'TypeCache'來解決這個問題,方法是輕微或弱地引用該值。 –
它仍然是我不清楚我怎麼可能在'.intercept訪問新的'_core'參數(InvocationHandlerAdapter.of((代理,方法,m_args) - > proxyHandler(核心,方法,m_args);' – lschuetze