当前位置: 首页 > 知识库问答 >
问题:

Java9如何运行使用未导出包的Java8编译的代码

计胤
2023-03-14

我使用Java-8编译器编译了以下代码:

package pack;
import sun.util.calendar.CalendarUtils;
public class A {
    public static void main(String[] args) {
        System.out.println(CalendarUtils.isGregorianLeapYear(2018));
    }
}
gyan@gyan-pc:~/codes/java$ ~/Documents/softwares/Linux/jdk1.8.0_131/bin/javac -d . a.java
a.java:2: warning: CalendarUtils is internal proprietary API and may be removed in a future release
import sun.util.calendar.CalendarUtils;
                        ^
a.java:9: warning: CalendarUtils is internal proprietary API and may be removed in a future release
        System.out.println(CalendarUtils.isGregorianLeapYear(2018));
                           ^
2 warnings
gyan@gyan-pc:~/codes/java$ java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
gyan@gyan-pc:~/codes/java$ java pack.a
false

共有1个答案

柯甫
2023-03-14

正如Alan所指出的,放松强封装一节在这方面陈述了以下内容:-

--illegal-access=permit打开运行时映像中每个模块中的每个包,以便在所有未命名的模块中编码,即在类路径上编码,如果该包存在于JDK 8中的话。这既支持静态访问(即通过编译的字节码),也支持通过平台的各种反射API进行深度反射访问。

对任何此类包的第一次反射访问操作将导致发出警告,但此后不会发出警告。此单个警告描述如何启用进一步的警告。此警告不能被抑制。

此外,如果您尝试使用

.../jdk-9.0.1.jdk/Contents/Home/bin/java --illegal-access=deny pack.Some

使用future default标志,您将无法像预期的那样使用以下跟踪执行代码:

Exception in thread "main" java.lang.IllegalAccessError: class
pack.Some (in unnamed module @0x1055e4af) cannot access class
sun.util.calendar.CalendarUtils (in module java.base) because module
java.base does not export sun.util.calendar to unnamed module
@0x1055e4af    at pack.Some.main(Some.java:7)
 类似资料:
  • 问题内容: 我在文件MyClass.java文件中有一个名为MyClass的类(下面提到的代码) 我在上课 但是我正在尝试使用 要么 我遇到错误 但是,如果我省略了软件包名称,则可以运行该程序。我要去哪里错了? 问题答案: 确保您位于包文件夹(已编译的类文件所在的文件夹)的父目录中,并执行以下命令: 下面是一个示例文件结构: 在上面的示例结构中,您将必须从“ bin”目录中执行命令。 另外,将类定

  • 该应用程序类似于加载css文件的主题查看器。 我想要捕获css“StyleManager”的警告(错误),这样我就可以在此解决方案中向用户发出警告 问题是com.sun.javafx.css.StyleManager没有导出,所以我得到错误: 我试着添加 没有任何运气! 在此之前,应用程序运行良好!!! J!

  • 我有一个用Java 8编译的可执行jar文件,其中包含一个名为< code>app.jar的JavaFX应用程序。 当我安装了Java8时,我可以简单地用运行它。 现在我只安装了Java 11,运行上面的命令会产生以下错误: 因为Java 11不再包含JavaFX。 所以我考虑安装JavaFX。openjfx.org以两种形式提供JavaFx:SDK和JMOD文件。 我认为我不需要SDK,因为我不

  • 问题内容: 我们已经构建了一个Go包,供我们许多人使用。 它是使用标准方法导入的。 但是,在编译时,我们所有的实用程序(包括很小的实用程序)最终都是很大的二进制文件。 我们提取了实用程序中的所有字符串,并发现整个软件包都被编译到每个实用程序中。包括那些实用程序未使用的功能。 编辑1: 谢谢回答这个问题的人。 这是我们所看到的: main.go play / subplay.go 永远不会调用函数B

  • 当我尝试安装一个应用程序时,有两种可能性: null 我试过的事情: 当构建文件夹中存在APK文件时运行应用程序(工作正常) 运行->运行应用程序(预计将构建项目并安装应用程序,但它显示了上面提到的错误!) 执行后清理和运行应用程序的过程相同

  • 我有一个使用Java Version8的Spring和Maven的项目。当我运行maven update时,它适用于Java9或更高版本,当我编译它时,它适用于Java8。我注意到了这一点,因为用Maven更新会将一个特定的类更改为Java9,而我无法导入这个类。 这个类是:javax.annotation.generated(Java8)。 这是要导入的类。但是,当我进行maven更新时,文件的