簡體   English   中英

運行java -cp和實現類加載器之間的區別

[英]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中,系統ClassLoadersun.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM