将反射代码从Java 8移植到Java 9+时,我注意到的一个问题是,在Java 8 {{1}之前,setAccessible()
现在除了InaccessibleObjectException
之外还抛出SecurityException
}}并非例外类型。
什么是接受的编写代码的方法,该代码必须捕获并处理一个未知的异常,因为它在将来的Java版本中仍然与当前版本兼容? (在这种情况下,唯一的祖先类是InaccessibleObjectException
,但是我个人写这样一个无所不包的RuntimeException
感觉就像是一种气味。)
答案 0 :(得分:1)
您可以向运行时请求Java版本(如this post中所述),并使用exception.getClass().getName()
以向后兼容的方式获取异常类名称
换句话说
try {
method.setAccessible();
} catch (RuntimeException e) {
String version = (System.getProperty("java.version"))
String minorVersion = ver.split("\\.")[1];
if (minorVersion >=9) {
if (e.getClass().getName().equals("java.lang.reflect.InaccessibleObjectException")) {
// Handle java 9 reflection access issue
} else {
// Handle java 8 runtime exception
}
}