当前位置: 首页 > 面试题库 >

如何在没有JVM参数的情况下在Java 9中隐藏警告“非法反射访问”?

宗穆冉
2023-03-14
问题内容

我只是尝试使用Java 9运行服务器,并收到下一个警告:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/home/azureuser/server-0.28.0-SNAPSHOT.jar) to constructor java.nio.DirectByteBuffer(long,int)
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
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

我想隐藏此警告而不--illegal-access=deny在启动过程中添加到JVM选项。就像是:

System.setProperty("illegal-access", "deny");

有什么办法吗?

建议使用JVM选项的所有相关答案,我想从代码中关闭它。那可能吗?

要澄清-我的问题是关于从代码而不是通过类似问题中所述的JVM参数/标志来启用此警告。


问题答案:

有几种方法可以禁用非法访问警告,尽管我不建议您这样做。

1.简单的方法

由于警告已打印到默认错误流,因此您只需关闭此流并重定向stderr到即可stdout

public static void disableWarning() {
    System.err.close();
    System.setErr(System.out);
}

笔记:

  • 这种方法合并了错误流和输出流。在某些情况下,这可能不是理想的。
  • 您不能仅通过调用来重定向警告消息System.setErr,因为错误流的引用IllegalAccessLogger.warningStream在JVM引导程序的早期就保存在字段中。

2.无需更改标准错误的复杂方法

一个好消息是,sun.misc.Unsafe仍可以在JDK 9中访问它而不会发出警告。解决方案是在IllegalAccessLoggerUnsafe
API的帮助下重置内部。

public static void disableWarning() {
    try {
        Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
        theUnsafe.setAccessible(true);
        Unsafe u = (Unsafe) theUnsafe.get(null);

        Class cls = Class.forName("jdk.internal.module.IllegalAccessLogger");
        Field logger = cls.getDeclaredField("logger");
        u.putObjectVolatile(cls, u.staticFieldOffset(logger), null);
    } catch (Exception e) {
        // ignore
    }
}


 类似资料:
  • 我只是尝试使用Java 9运行我的服务器,并得到下一个警告: 我希望隐藏此警告,而不在启动期间向JVM选项添加<code>--非法访问=拒绝</code>。类似于: 有什么办法吗? 所有建议使用JVM选项的相关答案,我想从代码中关闭它。这可能吗? 为了澄清-我的问题是关于从代码中转换此警告,而不是通过类似问题中所述的JVM参数/标志。

  • 我正在遵循Oracle的教程在JavaFX中创建TableView。在这个截图中,我复制并粘贴了代码,发现了几个错误,教程中没有提到这些错误。 TableView上的警告显示: TableView是原始类型。对泛型类型TableView的引用 表列上的警告说: 表列是一个原始类型。对泛型类型TableCol列的引用 addAll方法上的警告是: 类型安全:方法addAll(Object…)属于原始

  • 如何为非法反射访问警告引发异常?例如,考虑以下代码: 此代码将以下警告输出到 System.err: Boolean.TRUE是一个如此简单的值,以至于我真的不需要RefltionToStringBuilder。但是更复杂的类型(例如HashMap)打印相同的警告。我选择Boolean.TRUE是为了简化这个例子。 当我搜索此警告消息时,我发现了将其报告给包维护者,避免警告或完全禁用它的建议(JD

  • 我正在尝试设置一个动态,从本地目录读取文件。因此,我创建了以下可参数化类: 参数化流在的帮助下注册,如下所示: 启动应用程序后,我得到以下警告: 如果我理解正确的话,负责创建集成bean(从而设置beanFactory)。但是为什么我会收到这个错误信息呢?

  • 如果能帮助我重写一些使用反射的Java代码,以便在Java10上删除编译器中的警告,我将不胜感激: 这就是所讨论的Java方法: 这是GitHub上的问题代码:https://github.com/librepdf/openpdf/blob/master/openpdf/src/main/java/com/lowagie/text/pdf/mappedrandomaccessfile.java#l

  • 我正在使用minGW的minw-w64(x64)分叉nuwen.net.这是来自gcc的7.1版本: 我正在编译这个程序: 带有警告和c11标准: 我得到了这些警告: 我想在没有警告的情况下打印size_t,但在这种情况下不知道正确的格式说明符。