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

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