在将反射代码从
Java 8移植到
Java 9时,我注意到的一个问题是setAccessible()现在除了SecurityException之外还抛出InaccessibleObjectException,之前在Java 8中,InaccessibleObjectException不是异常类型.
编写代码的公认方法是什么,必须捕获并处理它无法知道的异常,因为它在未来的Java版本中仍然与当前版本兼容? (在这种情况下,唯一的祖先类是RuntimeException,但这对我个人来说就像是闻到了这样一个无所不包的捕获.)
最佳答案 您可以向运行时询问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
}
}