如何为非法的反射访问警告抛出异常?例如,考虑以下代码:
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 releaseBoolean.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":
代码:
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发布于 2018-03-08 22:10:41
0
1
https://stackoverflow.com/questions/49076972
复制相似问题