在JDK11上运行Java8代码-什么可能会中断?
目前,我们正在使用JDK8为Java8构建Java代码,并在JDK8上运行它在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的实现: 试试{ /*
如果我们只是将运行时环境更改为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相同的类路径上运行代码,就不会出现任何问题。从发布说明和迁移指南开始。