如何使Class.getMethod()引发SecurityException



我有一个实用的方法来为特定字段找到对象的getter方法(使用反射):

public static Method findGetter(final Object object, final String fieldName) {
    if( object == null ) {
        throw new NullPointerException("object should not be null");
    } else if( fieldName == null ) {
        throw new NullPointerException("fieldName should not be null");
    }
    String getterName = getMethodNameForField(GET_PREFIX, fieldName);
    Class<?> clazz = object.getClass();
    try {
        return clazz.getMethod(getterName);
    } catch(final NoSuchMethodException e) {
        // exception handling omitted
    } catch(final SecurityException e) {
        // exception handling omitted
    }
}

我想写一个涵盖SecurityException场景的单元测试,但如何让getMethod抛出SecurityException?

javadoc声明getMethod将抛出SecurityException

如果安全管理器s在场并且出现以下任何情况条件满足:

  • 调用s.checkMemberAccess(this,Member.PPUBLIC)拒绝访问方法

  • 调用方的类加载器与当前类和调用的类加载器不相同,也不是其祖先s.checkPackageAccess()拒绝访问此类的包

我更愿意正常地触发异常,而不是求助于一个嘲弄的框架。

System.setSecurityManager(new SecurityManager(){
    @Override
    public void checkMemberAccess(Class<?> clazz, int which) {
        throw new SecurityException("Not allowed")
    }
    @Override
    public void checkPermission(Permission perm) {
        // allow resetting the SM
    }
});
ClassTest.class.getMethod("foo");

请记住在finally块中调用System.setSecurityManager(null)以恢复原始状态。

就在常规设置中导致这种情况而言,很少会发生这种情况。

非公共方法将导致NoSuchMethodException,因为getMethod专门查找公共方法。getDeclaredMethod将找到该方法,但允许返回私有/受保护的方法。

唯一真正的方法是,正如javadocs所说,拥有一个由安全管理器保护的独立包,我猜这只能通过未签名的小程序或类似权限来完成。(我自己从来没有遇到过这种情况,所以我不完全确定)

最好的办法是通过重写安全管理器来强制为特定方法抛出异常。

相关内容

  • 没有找到相关文章

最新更新