有一些方法可以禁用非法访问警告,但我不建议这样做.
1.简单的方法
由于警告打印到默认错误流,您只需关闭此流并将stderr重定向到stdout.
public static void disableWarning() {
System.err.close();
System.setErr(System.out);
}
笔记:
>此方法合并错误和输出流.在某些情况下,这可能并不理想.
>只能通过调用System.setErr来重定向警告消息,因为错误流的引用在JVM引导程序早期保存在IllegalAccessLogger.warningStream字段中.
2.复杂的方法而不改变stderr
一个好消息是,在没有警告的情况下,仍然可以在JDK 9中访问sun.misc.Unsafe.解决方案是在Unsafe API的帮助下重置内部IllegalAccessLogger.
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
}
}