2.2.5 访问权限与异常处理

使用反射API的一个重要好处是可以绕过Java语言中默认的访问控制权限。比如在正常的代码中,一个类的对象是不能访问在另外一个类中声明的私有方法的,但是通过反射API可以做到这一点,具体的做法如代码清单2-19所示。Constructor、Field和Method都继承自java.lang.reflect.AccessibleObject,其中的方法setAccessible可以用来设置是否绕开默认的权限检查。

在利用invoke方法来调用方法时,如果方法本身抛出了异常,invoke方法会抛出InvocationTargetException异常来表示这种情况。在捕获到InvocationTargetException异常的时候,通过InvocationTargetException异常的getCause方法可以获取到真正的异常信息,帮助进行调试。

值得一提的是,Java 7为所有与反射操作相关的异常类添加了一个新的父类java.lang.ReflectiveOperationException。在处理与反射相关的异常的时候,可以直接捕获这个新的异常。而在Java 7之前,这些异常是需要分别捕获的。