【问题标题】:Using sun.reflect package with openjdk11将 sun.reflect 包与 openjdk11 一起使用
【发布时间】:2020-01-26 00:08:52
【问题描述】:

有没有办法在 OpenJDK11 中使用 sun.reflect,可能在“--add-exports”中添加一些东西?我们的代码失败了,因为 jide pkg 内部使用了 sun.reflect 包,我正在尝试看看是否有办法让它工作。

我已经尝试过以下方法,但没有帮助。

"--add-exports jdk.unsupported/sun.reflect=ALL-UNNAMED"

这是一个例外,基础类引用 sun.reflect.Reflection

java.lang.NoClassDefFoundError: sun/reflect/Reflection

【问题讨论】:

  • 您能否更新帖子以包含异常或至少包含您正在使用的 sun.reflect 中的类的名称?如果它不是 JEP 260 中确定的关键内部 API 之一,那么它将被删除(或移动)。
  • 更新帖子有例外。是否有一个链接列出了 OpenJDK11 中已删除的内容?谢谢。
  • sun.reflect.Reflection 最终被弃用,最终在 JDK 11 中被删除。您使用的是哪些方法?如果是 getCallerClass,那么你应该移动标准 API,即 java.lang.StackWalker。

标签: java-11 openjdk-11


【解决方案1】:

我遇到了这个问题,并通过使用更新版本的 jide 解决了它。从 jide-whatever:3.2.3 更改为 jide-whatever:3.7.6 足以让它在我的情况下工作。

【讨论】:

    【解决方案2】:

    如果您无法迁移到较新的版本,解决方案是围绕 Throwable().getStackTrace()[n].getClass() 进行包装并将其放入 WEB-INF/classes 文件夹中

    这是一个简单的解决方法。它适用于许多情况。

    package sun.reflect;
    public class Reflection {
            public static Class<?> getCallerClass(int n){
                StackTraceElement[] elements = new Throwable().getStackTrace();
                  return elements[n].getClass() ;
                }
    }
    

    https://github.com/rafaljot/NoClassDefFoundError-sun-reflect-Reflection

    【讨论】:

      【解决方案3】:

      可以在更新 jar 版本时修复。

      【讨论】:

      猜你喜欢
      • 2017-06-08
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2011-10-22
      相关资源
      最近更新 更多