[英]Difference between running java -cp and implementing a classloader
我想知道使用-cp命令行開關運行Java應用程序(提供文件夾或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(...);
好吧,對於一個人,像您的示例中那樣使用類加載器將意味着在源中對路徑進行硬編碼,與-cp
不同。
另外,您將負責自己加載類,而不是讓jvm解析它們。 除非有充分的理由,否則在我看來很多不必要的額外代碼。
另一個區別(以及類加載器的優點)是能夠按需加載它們。
在我的OpenJDK 7中,系統ClassLoader
是sun.misc.Launcher$AppClassLoader
的實例, sun.misc.Launcher$AppClassLoader
后者又是URLClassLoader
的子類,將使用系統屬性java.class.path
的文件創建java.class.path
。
如您所見,在我的環境中,似乎沒有重要的功能差異,盡管存在差異(例如,此AppClassLoader
已通過ClassLoader.registerAsParallelCapable()
注冊為“具有並行功能”,請參見ClassLoader
javadoc)。
由於Java是可移植的,因此我猜想JVM的其他實現可能會使用類似的機制。 因此在我看來,不會有重要的功能差異。 也許是默認權限策略,擴展等方面的差異,我認為這些功能不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.