我想知道,我已经尝试了无数令人费解的搜索术语来确定是否有办法延迟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
Run Code Online (Sandbox Code Playgroud)
如果我从构建路径中删除Jar,apiClass.getClassLoader()是预期的专有加载器.问题是我无法自由使用"org.company.comm.AConnection"或Jar中的任何其他类(包括IDE的自动完成),因为它实际上并不在构建路径上.
只有在首次使用类时才会加载类.因此,您的类不会在启动时加载,而是第一次需要来自此类的内容(包括静态方法,类型声明等).因此,默认行为是尽可能延迟加载.
如果要控制加载时间,可以通过ClassLoaer.loadClass()显式加载类.如果你的类包含了一些接口,你可以只在接口上访问代码(从而确保类不被某些依赖链加载)然后加载它(ClassLoader.loadclass())并在实际实例化时实例化它需要这个类的一个实例.