我想知道在运行我的Java应用程序与-cp命令行开关(提供文件夹或jar列表)和实现类加载器(例如,使用URLClassLoader类)之间是否存在任何功能差异加载类。
示例代码:
// -cp approach
java -jar <myjar.jar> -cp ~/folder/with/jars
另一种方法:
// URLClassLoader approach. urls is an array that points to the .jars under ~/folder/with/jars
URLClassLoader loader = new URLClassLoader(urls);
loader.findClass(...);
答案 0 :(得分:1)
嗯,首先,在您的示例中使用类加载器意味着源代码中的硬编码路径,与-cp
不同。
另外,你自己负责加载课程,而不是让jvm解决它们。看起来很多不必要的额外代码给我,除非有充分的理由这样做。
另一个区别(以及类加载器的优点)是能够按需加载它们。
答案 1 :(得分:1)
在我的OpenJDK 7中,系统ClassLoader
是sun.misc.Launcher$AppClassLoader
的实例,而URLClassLoader
的实例又是使用系统属性java.class.path
中的文件创建的AppClassLoader
的子类
正如您所看到的,在我的环境中,似乎没有重要的功能差异,尽管存在差异(例如,此ClassLoader.registerAsParallelCapable()
已注册为“并行能力”ClassLoader
,见{{1}} javadoc)。
由于Java是可移植的,我想JVM的其他实现可能会使用类似的机制。所以在我看来,没有重要的功能差异。也许默认权限政策,扩展等方面存在差异,我认为这些方法不起作用。