在JDK11上运行Java8代码-什么可能会中断?

在JDK11上运行Java8代码-什么可能会中断?,java,java-8,java-11,Java,Java 8,Java 11,目前,我们正在使用JDK8为Java8构建Java代码,并在JDK8上运行它 如果我们只是将运行时环境更改为JDK 11,会出现什么问题?至少有两个具体问题需要寻找: 对私有API的反射访问 方法句柄的使用 Java9及其后续版本引入了模块系统,该系统甚至通过反射强制缺少对私有API的访问。Java 8应用程序只能在Java 9上运行而不进行修改,但不能保证后续的JRE。作为一个实际示例,我有一些通过反射找到JavaFileManager的实现: 试试{ /*

目前,我们正在使用JDK8为Java8构建Java代码,并在JDK8上运行它


如果我们只是将运行时环境更改为JDK 11,会出现什么问题?

至少有两个具体问题需要寻找:

对私有API的反射访问

方法句柄的使用

Java9及其后续版本引入了模块系统,该系统甚至通过反射强制缺少对私有API的访问。Java 8应用程序只能在Java 9上运行而不进行修改,但不能保证后续的JRE。作为一个实际示例,我有一些通过反射找到JavaFileManager的实现:

试试{ /* *com.sun.tools.javac.processing.JavacProcessingEnvironment *.getContext->com.sun.tools.javac.util.Context */ 对象上下文= processingEnv.getClass .getMethodgetContext .invokeprocessingEnv; 调频= JavaFileManager context.getClass .getMethodget,Class.Class .invokecontext,JavaFileManager.class; }捕获异常{ } 现在会产生一个警告:

WARNING: An illegal reflective access operation has occurred                                                                                                                                                                           
WARNING: Illegal reflective access by ball.annotation.processing.AbstractProcessor (file:/Users/ball/.m2/repository/ball/ball-util/6.0.1-SNAPSHOT/ball-util-6.0.1-SNAPSHOT.jar) to method com.sun.tools.javac.processing.JavacProcessi\
ngEnvironment.getContext()                                                                                                                                                                                                             
WARNING: Please consider reporting this to the maintainers of ball.annotation.processing.AbstractProcessor                                                                                                                             
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations                                                                                                                                  
WARNING: All illegal access operations will be denied in a future release
在Java8中访问MethodHandles的方法在Java9及其后续版本中不起作用,反之亦然

Java 8的

构造函数= MethodHandles.Lookup.class .getDeclaredConstructorClass.class; constructor.setAccessibletrue; 类declarer=method.getDeclaringClass; 对象结果= constructor.newInstancedeclarer .报关员 .未经反思的特殊方法,庄家 .宾托洛克西 .援引争议性意见; 在Java 9及更高版本中,必须替换为:

类declarer=method.getDeclaringClass; 对象结果= MethodHandles.lookup .findSpecialdeclarer,method.getName, methodTypemethod.getReturnType, method.getParameterTypes, 庄家 .宾托洛克西 .援引争议性意见;
除了已经说过的,一些库在JRE更新时中断。我有过Jasper的经验,Jasper是Tomcat中使用的JSP编译器,因为Jasper需要从JRE读取类文件,而旧Jasper版本+新JRE版本=error


最后,您只需对其进行测试,看看会发生什么。

如果您遵守所有接口契约,则什么都不会发生。Java是向下兼容的,这就是为什么我们仍然有原始类型的原因……不是这样。例如,如果您使用Apache Jackrabbit 2.14.x,那么它将在JDK 8上运行,但在JDK 11上会中断。请阅读发行说明。为什么这个问题会受到如此严重的影响?这个问题确实提出了人们可能会面临的实际问题,但这将针对开发的每个库/服务。所以,什么会破裂,取决于你已经拥有了什么,以及周围的情况如何。例如,您在评论中引用,您最了解项目的依赖关系,而其他人则不了解 能够提供答案。JDK开发人员的期望是,只要在与JDK-8相同的类路径上运行代码,就不会出现任何问题。从发布说明和迁移指南开始。