首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为非法的反射访问警告抛出异常?

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

Stack Overflow用户
提问于 2018-03-02 20:35:37
回答 1查看 3K关注 0票数 6

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

代码语言:javascript
复制
import org.apache.commons.lang3.builder.*;

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

此代码将以下警告打印到System.err:

代码语言:javascript
复制
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是一个非常简单的值,所以我并不真正需要ReflectionToStringBuilder。但是更复杂的类型(如HashMap)会打印相同的警告。为了简化这个示例,我选择了Boolean.TRUE。

当我搜索这条警告消息时,我发现了向包维护人员报告它、避免警告或完全禁用它(JDK9: An illegal reflective access operation has occurred. org.python.core.PySystemState)的建议。

我想为警告抛出一个异常,以便获得非法访问发生的位置的堆栈跟踪。然后,我可以更改代码,以避免造成警告的非法访问。我也想做一个单元测试,以检查警告在未来。

我试着根据System.err的问题StackOverflow ( JUnit test for System.out.println() )测试打印到JUnit test for System.out.println()。这包括将System.err设置为ByteArrayOutputStream,然后检查内容。但不幸的是,根据How to hide warning “Illegal reflective access” in java 9 without JVM argument?的说法,IllegalAccessLogger在JVM引导过程中获得了对System.err的引用,然后我才能更改它。

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

代码:

代码语言:javascript
复制
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");
    }
}

输出:

代码语言:javascript
复制
Start
err-1
End
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-08 22:10:41

  1. 打开Eclipse开发环境。
  2. 选择运行菜单->运行配置..。-> Java ->(您的配置)->参数。
  3. 在VM参数文本框中,键入“-非法-访问=拒绝”。
  4. 单击“应用”按钮。
  5. 单击“运行”按钮。
  6. 非法访问将引发java.lang.reflect.InaccessibleObjectException 1。

0

1

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49076972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档