Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让Byte Buddy将多个类型加载到同一个包装器类加载器中_Java_Classloader_Introspection_Byte Buddy_Bytecode Manipulation - Fatal编程技术网

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

Java 如何让Byte Buddy将多个类型加载到同一个包装器类加载器中,java,classloader,introspection,byte-buddy,bytecode-manipulation,Java,Classloader,Introspection,Byte Buddy,Bytecode Manipulation,我在一个场景中使用Byte-Buddy,在这个场景中,我可能需要用它创建几十个类。这些是实现接口的独立类,而不是代理 现在我正在加载我的DynamicType。通过包装我的应用程序的一个类加载器,将实例卸载到类加载器中: 最终类myClass= 未加载类型 .load(someAppClassLoader、ClassLoadingStrategy.Default.WRAPPER) .getLoaded(); 这种包装策略对我来说是正确的,但是每次我在上面执行代码时,都会创建一个新的、密封的Cl

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

现在我正在加载我的
DynamicType。通过包装我的应用程序的一个类加载器,将
实例卸载到类加载器中:

最终类myClass=
未加载类型
.load(someAppClassLoader、ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
这种包装策略对我来说是正确的,但是每次我在上面执行代码时,都会创建一个新的、密封的
ClassLoader
,它只包含新类。我知道我可以“包括”辅助类型。。。但这些不是辅助类型,而是完全独立的类

由于我必须创建数千个类,因此留下了大量我并不真正需要的类加载器,因为我想将bytebuddy创建的类与其他类隔离开来,而不是一个与另一个隔离开来,也不需要为每个类创建一个新的类加载器。我的分析显示,大量的类装入器(在本例中,这些类装入器相当繁重)会带来相当大的内存开销

从我的测试来看,我似乎可以对第一个使用包装策略:

最终类myClass=
类型
.load(someAppClassLoader、ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
…然后检索新的类加载器:

final ClassLoader bbClassLoader=myClass.getClassLoader();
…然后通过将策略切换到注入,在后续创建中使用该类装入器:

final Class myOtherClass=
其他未加载类型
.load(bbClassLoader、ClassLoadingStrategy.Default.INJECTION)
.getLoaded();
但在我看来,这并不是一个干净的策略,因为它似乎是通过内省注入的,以避免类装入器是密封的这一事实。因此,我想知道是否有一种更好的机制可以在Byte Buddy中实现这一点

请注意,为了拥有一个正确密封的类加载器,我可以将数千个
DynamicType.unload
对象一次转换为
class
对象,并将其密封到单个类加载器实例中。我可以在应用程序引导时批量初始化我的所有类,然后不需要进一步动态创建类就可以让类加载器单独运行


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

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

然后,您可以将第一个类加载器强制转换为
InjectionClassLoader
,这允许使用
InjectionClassLoader.Strategy.INSTANCE
,在这里可以在没有任何不安全API的情况下注入其他类


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

再次感谢。此外,API将未密封的类加载器描述为任何获得类加载器实例引用的人都可以“破坏包封装”。你能举一个例子说明“破坏封装”的意思吗?我试图评估一个“opened()”类加载器可能会给我带来的风险…很乐意帮忙。如果生成的代码具有包私有成员,任何人都可以将新类注入打开的类装入器并访问这些成员。