gpt4 book ai didi

java - 如何让 Byte Buddy 将多种类型加载到同一个包装类加载器中

转载 作者:行者123 更新时间:2023-11-30 05:41:33 24 4
gpt4 key购买 nike

我使用 Byte Buddy 的场景是,我可能需要用它创建几十万个类。这些是实现接口(interface)的独立类,而不是代理。

现在我正在加载我的 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();

...然后在后续创建中使用该类加载器,将策略切换为注入(inject):

final Class<?> myOtherClass =
otherUnloadedType
.load(bbClassLoader, ClassLoadingStrategy.Default.INJECTION)
.getLoaded();

但这对我来说看起来不像是一个干净策略,因为它似乎是通过内省(introspection)注入(inject)来规避类加载器被密封的事实。所以我想知道Byte Buddy是否有更好的机制来做到这一点。

请注意,为了拥有一个正确密封的类加载器,我可以将所有数千个 DynamicType.Unloaded对象进入Class<?>立即将其放入单个类加载器实例中(并将其密封)。我可以在应用程序引导时批量初始化所有类,然后让类加载器保持独立,而无需进一步创建动态类。

对于像我这样的场景,正确的策略是什么?

最佳答案

使用WRAPPER策略创建的类加载器允许在类加载器生命周期的后期加载类。出于安全原因,需要通过调用策略上的 opened() 来启用此功能。

然后,您可以将第一个类加载器转换为 InjectionClassLoader,它允许使用 InjectionClassLoader.Strategy.INSTANCE,其中可以注入(inject)其他类,而无需任何不安全的 API。

您还可以通过调用 include 组合多个 DynamicType 实例,然后使用 WRAPPER 一次性加载所有类。

关于java - 如何让 Byte Buddy 将多种类型加载到同一个包装类加载器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55536387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com