4

我想知道,我尝试了无数复杂的搜索词来确定是否有办法延迟 Java 中类的加载。我的意思是,可以在类/构建路径上找到这些类,但我不希望它们在启动时加载。这会导致使用了错误的类加载器。

我是否可以选择性地延迟或阻止默认类加载器加载某些类/JAR?

示例(在构建路径上使用 3rd 方 jar):

// boilerplate main
JarWrapper apiJar = SpecialJarLoader("api.jar"); // SpecialJarLoader is a proprietary class loader
Class apiClass = apiJar.loadClass("org.company.comm.AConnection"); // runtime failure here due to the class already being loaded

如果我从构建路径中删除 Jar,则 apiClass.getClassLoader() 是预期的专有加载器。问题是我不能随意使用“org.company.comm.AConnection”或 Jar 中的任何其他类(包括 IDE 的自动完成),因为它实际上不在构建路径上。

4

2 回答 2

5

类仅在首次使用时才加载。因此,您的类将不会在启动时加载,而是在第一次需要该类的某些内容(包括静态方法、类型声明等)时。因此,默认行为是尽可能延迟加载。

如果要控制加载时间,可以通过 ClassLoaer.loadClass() 显式加载类。如果您的类包含某个接口,则您只能在接口上访问代码(从而确保该类不被某些依赖链加载)然后加载它(ClassLoader.loadclass())并在您实际实例化它需要这个类的一个实例。

于 2012-10-01T20:16:54.080 回答
0

做到这一点的唯一方法是使用 JNI(即在 C 中)编写您的 CUSTOM JAVA 加载器

这样,您可以选择性地加载一个类。

于 2012-10-01T20:18:03.583 回答