- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
今天,我很惊讶(可能是由于缺乏经验)发现您可以,而且实际上很有用,将一个空路径(字面意思是一个空字符串)传递给 ClassLoader.getResources
, IE。ClassLoader.getSystemClassLoader().getResources("")
.通过一些测试,这会返回我的应用程序 .class
所在的一个或两个目录。文件实时(并且不包括第 3 方包的目录)。 (用法示例:Get all of the Classes in the Classpath。)
据推测,这是因为 Java System ClassLoader 是加载我自己的应用程序类的三个 ClassLoader 之一(参见 http://www.oracle.com/technetwork/articles/javase/classloaders-140370.html ),所以返回的 URL 指向我的应用程序类文件的目录也就不足为奇了。
但是空字符串为什么以及如何实现这一点?我没有发现它记录在案。这个空路径是更常见的 Java 约定的派生词吗?它肯定不是 Linux - 你不能 cd
进入 bash 中的空路径。如果有人可以帮助我理解这一点,我将不胜感激。
在另一个注释中,我注意到 getResources(".")
达到同样的目的。
添加评论讨论
public class myTest {
public static void main(String[] args) throws Exception {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader) classLoader).getURLs();
for (int n = 0; n < urls.length; n++)
System.out.println(urls[n]); //lists external.jar
Enumeration<URL> roots = classLoader.getResources(".");
while (roots.hasMoreElements()) {
URL url = roots.nextElement();
System.out.println("getResources: " + url); //does not list external.jar
}
}
}
java -cp ".:external.jar" myTest
最佳答案
为什么 getResources(String)
当给定资源名称“”或“。”时,调用匹配所有作为目录的类路径条目?
我只能推测。对于它的值(value),我认为这是特定 ClassLoader
的实现细节.方式“”和“。”然而,从文件系统用户的角度来看,处理资源名称还是有些直观的。
...如何?
默认的 OpenJDK 应用程序 ClassLoader
(也称为系统 ClassLoader
),sun.misc.Launcher$AppClassLoader
, 是 URLClassLoader
具有包含“java.class.path”系统属性值的 URL 搜索路径的后代。其getResources
(getResource
以及)方法最终委托(delegate)给 sun.misc.URLClassPath$FileLoader.getResource(String, boolean)
,它执行以下操作:
url = new URL(getBaseURL(), ParseUtil.encodePath(name, false));
...
file = new File(dir, name.replace('/', File.separatorChar)); // dir is the equivalent of getBaseURL()'s path component
...
if (file.exists()) {
return new sun.misc.Resource() {
...
public URL getURL() { return url; } // eventually returned by the ClassLoader
}
}
name
""或 "."的参数匹配搜索路径条目本身。换句话说,所有顶级类路径条目都被匹配并返回,就好像它们都位于同一个根目录下一样。请注意,这不适用于 JAR 类路径条目,而是由
sun.misc.URLClassPath$JarLoader
处理。 .
getResources
调用也匹配 JAR 类路径条目?以及为什么 URLClassLoader.getURLs()
返回的数组中包含此类路径条目?
getResources
, 根据
URLClassLoader
对术语“资源”的具体定义被指定为在其搜索路径下返回文件、目录或 JAR 条目。当搜索路径条目表示目录时,它也恰好返回搜索路径条目本身的事实没有被其规范解决,因此应该被视为实现细节(也可能是轻微的规范违规)而不是依赖.同样,它不返回 JAR 搜索路径条目这一事实虽然与前者不一致,但并不违反其规范。
getURLs
另一方面,返回在实例化时提供的确切 1 搜索路径条目。
sun.misc.URLClassPath$FileLoader
,如前所述,它根据每个搜索路径条目的文件系统路径解析资源名称,
sun.misc.URLClassPath$JarLoader
通过
JarFile.getEntry(name)
尝试直接匹配,对于“”,最有可能的“。”,条目名称,显然失败了。但即使两者
URLClassPath.Loader
s 以相同的方式解释资源名称,事情不会按预期进行,因为嵌入式 JAR 文件系统不支持根目录的概念。
ClassLoader
实际上,使用类似的东西
String[] classPathEntries = System.getProperty("java.class.path").split(File.pathSeparator);
main
早期方法,在任何第三方代码有机会修改属性之前。
ClassLoader.getSystemClassLoader()
返回类型为 java.lang.ClassLoader
.我们如何(确定地)知道返回的实例是 sun.misc.Launcher$AppClassLoader
?
try {
ClassLoader sysCl = ClassLoader.getSystemClassLoader();
// not using single-arg Class.forName, since it would use the ClassLoader of this class,
// which, in the worst-case scenario of being a non-delegating loader, could attempt to load AppClassLoader itself
if (Class.forName("sun.misc.Launcher$AppClassLoader", false, sysCl).isAssignableFrom(sysCl.getClass())) {
// default implementation, _most likely_ a URLClassLoader subclass
}
else {
// System ClassLoader overridden, or not on OpenJDK
}
}
catch (ReflectiveOperationException roe) {
// most likely not on OpenJDK
}
sun.misc.URLClassPath
的来源具体情况。
关于Java 空路径约定,尤其是 ClassLoader.getResources 中使用的约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45624909/
假设我有一个函数,例如 f(x,y)但y参数是可选的。设置y的首选方式是什么?作为可选参数?对我有用的一种选择: function f(x, y=nothing) # do stuff
在学习核心动画时,我很快就了解到,如果你做得不对,你会得到非常奇怪的未定义行为。为此,我有几个问题可以帮助我从概念上更好地理解它。 我的 NSView 子类在其 init.h 中声明以下内容:该 Vi
我一直在尝试学习 ClojureScript,并偶然发现了一些非常神秘的函数名称。 例如: (.-length str) 来自 om 文档: (defn add-contact [data owner
我对此很好奇。我最近想到使用大括号来隔离代码段,以进行可视化组织,并将变量隔离到特定范围(如果只是为了防止它们在较大的函数中混淆 Eclipse 中的建议)。例如: public void start
所以我进行了一些搜索,但在 Google 或 PEP 上找不到任何讨论此问题的内容。 我正在使用 tkinter 做一个项目,我有一个文件,它是项目的一部分,只有 200 行代码(不包括所有注释掉的代
根据某种不成文的约定,所有 API key 都是十六进制数字吗? 最佳答案 对一些半随机数据(例如时间戳 + 用户 ID + key )进行 md5 哈希是一种快速生成难以猜测的固定长度 key 的方
在 C 中,如果编译器想要提供实现定义的标识符(语言扩展、内在函数、伪函数和伪宏,基本上任何不是语言标准保留关键字但也不是常规函数的东西)惯例是名称以下划线为前缀;据了解,代码不应出于正常目的使用此类
Java Bean 的约定之一是: setter 的返回类型必须是 void。 或者至少大多数人是这么说的。我的问题是:它真的必须无效吗?我喜欢返回 "this" 而不是 "void" 因为我可以像这
我对 Java 编码风格有疑问。 我编码: public class Pattern { public Pattern(...) { ... } public static List
我有一个关于 Java servlet 约定的问题。在查看 servlet 的任何教程时,无论是 Eclipse、NetBeans 等,它们总是让您创建一个 index.jsp 页面。创建页面后,他们
在 python 中,当变量名与保留字冲突时(如 class、in、default 等),PEP8约定规定应使用尾随下划线(class_、in_、default_)。 对于相同的情况,共享最多的 ja
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
Java 存储预定义字符串集的主要约定是什么?现在我有一个包含我使用的所有字符串的类,但感觉确实有更好的方法来做到这一点。 这就是我在 my_strings.java 类中所做的 public fin
我经常需要检索结果并按给定列访问它们。 有没有一种方法可以不用每次都遍历整个数据集来编写它? 我研究了各种 PDO 获取模式,但没有发现比这更简单的模式。谢谢。 function get_groups
所以我正在制作这个 android 应用程序,它需要从用户提供的 CSV 文件中读取数据。 CSV 文件在台式电脑上编辑起来更舒服,所以我在应用程序中没有编辑器,它是“只读”的;我假设手机的 SD 卡
我正在编写一个文件,该文件是 npycurses module 的子类 npycurses.ActionFormV2 ,我正在覆盖 beforeEditing method ,所以当我整理我的文件时,
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我正在开发一个可在 iPhone、iPad 和其他移动设备上运行的网页。我很好奇是否有关于移动设备 CSS 最佳实践的资源。 我试过搜索,但想出了随机网站 with tidbits of inform
我发现开始编程时最大的挑战之一是掌握文件路径。例如,当您引用目录结构中同一级别的文件夹中的路径时,您将看到: /folder/style.css 或 文件夹/style.css等 当您引用不同的文件时
如果我有如下函数: def foo(): return 1, 2 我通常会这样调用函数: g, f = foo() 但是,如果我从不打算使用返回的第二个值,是否有一种调用函数的方法可以明确说明
我是一名优秀的程序员,十分优秀!