当前位置: 首页 > 知识库问答 >
问题:

如何抛出非法反射访问警告的异常?

符允晨
2023-03-14

如何为非法反射访问警告引发异常?例如,考虑以下代码:

import org.apache.commons.lang3.builder.*;

class Test {
    public static void main(String[] args) {
        System.out.println(ReflectionToStringBuilder.toString(Boolean.TRUE));
    }
}

此代码将以下警告输出到 System.err:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.commons.lang3.builder.ReflectionToStringBuilder (file:/Users/brianschack/eclipse-workspace/User%20Libraries/com
mons-lang3-3.7/commons-lang3-3.7.jar) to field java.lang.Boolean.value
WARNING: Please consider reporting this to the maintainers of org.apache.commons.lang3.builder.ReflectionToStringBuilder
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

Boolean.TRUE是一个如此简单的值,以至于我真的不需要RefltionToStringBuilder。但是更复杂的类型(例如HashMap)打印相同的警告。我选择Boolean.TRUE是为了简化这个例子。

当我搜索此警告消息时,我发现了将其报告给包维护者,避免警告或完全禁用它的建议(JDK9:发生了非法的反射访问操作。

我想为警告抛出一个异常,以便获取非法访问发生的堆栈跟踪。然后我可以修改代码以避免导致警告的非法访问。我还想做一个单元测试,在将来检查警告。

我试图根据StackOverflow问题测试打印到System.err,System.out.println()的JUnit测试。这涉及将 System.err 设置为 ByteArrayOutputStream,然后检查内容。但不幸的是,根据如何在java 9中没有JVM参数的情况下隐藏警告“非法反射访问”?,IllegalAccessLogger在JVM引导期间获得了对System.err的引用,然后我才能更改它。

我还尝试关闭System.err,但似乎打印到关闭的流会无声地失败,而不是抛出异常。请注意,以下代码的输出不包含字符串“err-2”:

代码:

class Test {
    public static void main(String[] args) {
        System.out.println("Start");
        System.err.println("err-1");
        System.err.close();
        System.err.println("err-2");
        System.out.println("End");
    }
}

输出:

Start
err-1
End

共有1个答案

罗翔
2023-03-14
  1. 打开Eclipse开发环境。
  2. 选择运行菜单-

[0] http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-May/012673.html

[1]http://docs . Oracle . com/javase/9/docs/API/Java/lang/reflect/inaccessibleobjectexception . html

 类似资料:
  • 我在Eclipse(版本2019-06)中运行一个项目,它在我的java计算机上运行得很好--“OpenJDK 1.8.0_222” 然而,当我尝试tor在Eclipse(版本2021-3)上的另一台计算机上用java运行该项目时--“OpenJDK版本”1.8.0_292“,它不起作用! 我得到以下错误: 警告:发生非法反射访问操作警告:com.google.gson.internal.bind

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

  • JDK11+spring批处理 有人知道那些警告是什么意思吗: 警告:发生了非法的反射访问操作警告:org.springframework.cglib.core.reflectutils$1(jar:file:/users/boru/downloads/spcljr/build/libs/spcljr-0.0.1-snapshot.jar!/boot-inf/lib/spring-core-5.0

  • 我刚买了一台新电脑,决定开始尝试制作《我的世界》模型。超级新,不知道我在做什么,跟着导游走。 在过去的一个小时里,我一直在努力让它工作,我卸载了所有的东西,重新安装了所有的东西,重新启动了我的计算机,手动删除了更改了启动配置的JDK环境,任何我能想到的东西。 我在google上找到的所有其他实例都说我不需要以后安装JDK,我必须有JDK8,但我从来没有另一个版本。 如有任何帮助,不胜感激。

  • 问题内容: 我已经安装了Java 和成功。所有进程运行良好 但是,每当我尝试执行任何命令(如收到此警告)时, 请帮助解决此问题。这是我的〜/ .bashrc文件配置 问题答案: 您不能对这些警告采取任何措施,这与拼图项目和更强的封装能力有关。 基本上有一个称为的类,它是称为“模块”的一部分。该模块“定义”了它输出的内容(其他人可以从中使用什么)以及向谁输出。这也用普通的英语表示这不是供公众使用的-