System.getProperty("java.class.path")和getClassLoader.getURLs()有什么区别?

9

System.getProperty("java.class.path")返回的是我的程序的类路径。然而,getClassLoader().getURLs()也提供了与此相同的类路径(请参见我的其他帖子:如何使用getClassLoader)。

这两种方式有什么区别?

3个回答

11

主要的差别在于它们返回的内容不同:

getClassLoader.getURLs()

返回用于加载类和资源的URL的搜索路径。这包括构造函数指定的原始URL列表以及任何通过addURL()方法后续追加的URL,详见链接

System.getProperty("java.class.path")

用于查找包含类文件的目录和JAR档案的路径。类路径的元素由path.separator属性指定的平台特定字符分隔,详见链接

从定义上看,这里有一些区别:

  1. 第一个返回URL数组,而第二个返回字符串。
  2. 第一个还将返回使用API在运行时附加的任何URL,而第二个不会包括它们。

或多或少取决于您尝试实现什么,需要决定选择哪个。

干杯!


3
“getClassLoader.getURL()”不是合法的Java代码,在添加缺少的括号后也不对应于ClassLoader的有效方法。很难但并非不可能看出OP在说什么,但我不知道你从哪里得到这个不存在的方法的所有信息。 - user207421
@EJP - 感谢您指出这一点,已更改方法名称,请查看编辑。 - Sachin Thapa

2

一个区别是,没有'ClassLoader.getURL()'这样的方法。

你获得 URL 的 ClassLoader(虽然不是通过你提到的不存在的方法),可能并不是系统类加载器。它可能是 URLClassLoader,它与类路径无关。


@Thomas OP提到了一个不存在的方法。你可以猜测他可能想表达什么。我会按照实际问题所写的方式来回答。我不明白你对兴奋的误解与此有何关系。 - user207421

-1
一个猜测是,ClassLoader需要类路径才能找到要加载的内容,getClassLoader()也调用了本地方法,JVM可能直接获取类路径并将其加载到类加载器中。
你正在以不同的方式访问相同的数据。

我认为两种方式访问的数据不同(请参见其他答案)。 - barfuin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接