【问题标题】:JDK 9 unsafe import sun.misc.LauncherJDK 9 不安全导入 sun.misc.Launcher
【发布时间】:2018-05-18 15:50:20
【问题描述】:

我最近升级到 JDK 9 并且 Eclipse 抱怨无法导入 sun.misc.Launchersun.misc.Launcher 似乎不安全。 我正在寻找替代方案来替换我的项目中的这行代码。

final URL url = Launcher.class.getResource("/");

任何帮助将不胜感激。

更新:上述代码块的更完整版本是:

final URL url = Launcher.class.getResource("/");
final File fs = new File(url.toURI());
for (File f : fs.listFiles()) {
     System.out.println(f.getAbsolutePath());
}

这是在IDE中启动程序时打印src文件夹中的所有文件。

【问题讨论】:

  • 您能否详细说明一下您最终要使用上​​述代码行实现什么?
  • 嘿,JDK 9 有几个'internal' api restricted 来自外部访问.. 你需要找到它的替代品。
  • sun.misc.Launcher 是 JDK 8 及更早版本中的 JDK 内部类,用于在调用 main 方法之前创建内置类加载器和其他初始化。 JDK 9 中不存在该类。

标签: java java-9 getresource


【解决方案1】:

Class.getResource 方法可以在任何Class 上调用

final URL url = ClassInTheCurrentModule.class.getResource("/");

更新

根据会员反馈编辑

【讨论】:

  • ClassLoader.class.getResource("/") 不幸返回 null。虽然 MyClass.class.getResource("/") 工作得很好。
  • ClassLoader 返回 null,Object 也是如此,所以我猜这个类必须来自我的 src 文件夹。抱歉,如果以下内容没有回答问题,因为我不是这方面的专家,但 MyClass 是上述代码所在的类。我还尝试用我的 src 文件夹中的其他类替换 MyClass,它也可以。
  • 自 Java 1.1 以来一直有效;从来没有理由使用私有的、特定于实现的 sun. … 类。
【解决方案2】:

从模块中尝试访问其类的任何类调用Class.getResource 应该可以正常工作。

final URL url = ClassInTheCurrentModule.class.getResource("/");

answer by shazin 可能返回null 的原因可能是ClassLoadergetResource 调用的调用者:

当资源是包中的非“.class”资源时返回null 对调用者的模块不开放。

由于ClassLoader 属于模块java.base 中的包java.lang,因此您的模块可能无法打开。

另外,请注意getResource 的分辨率针对命名和未命名模块进一步划分。

【讨论】:

  • 空指针是正确的。如果资源是包含在您的库或应用程序中的东西,而 Class.getResource 是用于定位它的 API。如果您要扫描类路径以查找其他库或应用程序包含的资源,则使用 ClassLoader.getResource。
猜你喜欢
  • 2023-03-21
  • 2021-08-04
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多