我正在使用Byte Buddy,在這種情況下,我可能需要用它創(chuàng)建幾十萬(wàn)個(gè)類。這些是實(shí)現(xiàn)接口的獨(dú)立類,而不是代理?,F(xiàn)在,我通過(guò)包裝應(yīng)用程序的一個(gè)類加載器將我的實(shí)例加載到類加載器中:DynamicType.Unloaded<?>final Class<?> myClass = unloadedType .load(someAppClassLoader, ClassLoadingStrategy.Default.WRAPPER) .getLoaded();這種包裝策略適合我,但我遇到的問(wèn)題是,每次我執(zhí)行上面的代碼時(shí),都會(huì)創(chuàng)建一個(gè)僅包含新類的新密封。我知道我可以“包括”輔助類型...但這些不是輔助類型,而是完全獨(dú)立的類。ClassLoader由于我必須創(chuàng)建數(shù)千個(gè)類加載器,因此我留下了大量我并不真正需要的類加載器,因?yàn)槲蚁雽ytebuddy創(chuàng)建的類與其余類隔離開來(lái),但不是一個(gè)類,也不需要為每個(gè)類加載器創(chuàng)建一個(gè)新的類加載器。我的分析顯示,大量類加載器(在本例中相當(dāng)重)帶來(lái)了相當(dāng)大的內(nèi)存開銷。從我的測(cè)試中,我似乎可以對(duì)第一個(gè)使用包裝策略:final Class<?> myClass = type .load(someAppClassLoader, ClassLoadingStrategy.Default.WRAPPER) .getLoaded();...然后檢索新的類裝入器:final ClassLoader bbClassLoader = myClass.getClassLoader();...然后在后續(xù)創(chuàng)建中使用此類裝入器,方法是將策略切換到注入:final Class<?> myOtherClass = otherUnloadedType .load(bbClassLoader, ClassLoadingStrategy.Default.INJECTION) .getLoaded();但這對(duì)我來(lái)說(shuō)看起來(lái)不是一個(gè)干凈的策略,因?yàn)樗坪跏峭ㄟ^(guò)內(nèi)省注入的,以規(guī)避類加載器被密封的事實(shí)。所以我想知道是否有更好的機(jī)制在Byte Buddy中做到這一點(diǎn)。請(qǐng)注意,為了有一個(gè)正確密封的類裝入器,我可以一次將我所有的數(shù)千個(gè)對(duì)象變成一個(gè)類裝入器實(shí)例(并密封它)。我可以在應(yīng)用程序引導(dǎo)時(shí)批量初始化我的所有類,然后不用進(jìn)一步動(dòng)態(tài)創(chuàng)建類加載器。DynamicType.UnloadedClass<?>對(duì)于像我這樣的場(chǎng)景,正確的策略是什么?
1 回答

猛跑小豬
TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
使用策略時(shí)創(chuàng)建的類裝入器允許在類裝入器生命周期的稍后階段裝入類。出于安全原因,需要通過(guò)調(diào)用策略來(lái)啟用此功能。WRAPPER
opened()
然后,您可以將第一個(gè)類加載器強(qiáng)制轉(zhuǎn)換為該加載器,以便在沒(méi)有任何不安全的 API 的情況下注入其他類的位置使用。InjectionClassLoader
InjectionClassLoader.Strategy.INSTANCE
您還可以通過(guò)調(diào)用來(lái)組合多個(gè)實(shí)例,然后在一次清洗中使用加載所有類。DynamicType
include
WRAPPER
添加回答
舉報(bào)
0/150
提交
取消