是否可以延迟加载类,可能会在以后动态加载?

时间:2012-10-01 20:14:28

标签: java classloader

我很想知道,我尝试过无数繁琐的搜索术语,以确定是否有办法延迟加载Java中的类。我的意思是,类可以在类/构建路径上找到,但我不希望它们在发布时加载。这导致使用了错误的类加载器。

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

示例(在构建路径上使用第三方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的自动完成),因为它实际上并不在构建路径上。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

唯一的方法是使用JNI编写CUSTOM JAVA加载程序(即在C中)

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