如何在没有JVM参数的情况下在Java 9中隐藏警告“非法反射访问”?
我只是尝试使用Java 9运行服务器,并收到下一个警告:
WARNING: An illegal reflective access operation has occurredWARNING: 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中访问它而不会发出警告。解决方案是在IllegalAccessLogger
Unsafe
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
}
}
以上是 如何在没有JVM参数的情况下在Java 9中隐藏警告“非法反射访问”? 的全部内容, 来源链接: utcz.com/qa/405019.html