0

我正在尝试执行下面的书面代码,代码应该抛出异常,但它不是这样做的

try {
    Field.class.getMethod("getInt", Object.class).setAccessible(false);
    StringSearch.class.getMethod("searchChars",cc.getClass(),pattern3.getClass()).setAccessible(false);
    ss4.getClass().getMethod("searchChars",cc.getClass(),pattern3.getClass()).setAccessible(false);
    ss4.searchChars(cc,pattern3);
    ss4.searchString(str,pattern);
}
catch(NoSuchMethodException ex){
    ex.printStackTrace();
}

它实际上应该抛出 IllegalAccessException。

ss4 是 BNDMWildcardsCI 类的对象(字符串搜索算法之一) cc,pattern3 是字符数组 str,pattern 是字符串

为什么它没有抛出异常,它没有抛出 NoSuchMethodFound 异常意味着它能够找到该方法我也尝试打印 isAccessible 并且它说 false 但是当我运行测试时它不会抛出任何异常

4

2 回答 2

2

据我所知,如果一个方法被声明为公共(或以其他方式可访问),setAccessible(false)则不能将其设为私有。仅当您有私有方法并且之前调用过setAccessible(true).

于 2012-12-11T00:06:04.170 回答
0

该方法setAccessible(boolean)作用于对象而不反映在正常对象上。在您的代码中,您将其设置在方法对象上而不是ss4对象上。

为了表明我的观点:

Class<?> clazz = ss4.getClass();
Method searchCharsMethod = clazz.getMethod("searchChars",cc.getClass(),pattern3.getClass());
       searchCharsMethod.setAccessible(true);

您已将对象的可访问标志设置为 false 分配给searchCharsMethodnot ss4

作为奖励,看看你打电话时会发生什么

searchCharsMethod.invoke(ss4,cc,pattern3);

有关更多信息,请阅读文档

于 2012-12-11T00:28:34.043 回答