代码没有抛出异常

时间:2012-12-10 23:53:00

标签: java illegalaccessexception

我正在尝试执行下面编写的代码,代码应该抛出一个异常,但它不是doint it

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是Strings

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

2 个答案:

答案 0 :(得分:2)

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

时,它才有用

答案 1 :(得分:0)

对象的setAccessible(boolean)方法工作不反映普通对象。在您的代码中,您将其设置在不在ss4对象上的方法对象上。

表明我的观点:

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

您已在分配给searchCharsMethod而非ss4的对象上将可访问标记设置为false。

作为奖励,看看你打电话时发生的事情

searchCharsMethod.invoke(ss4,cc,pattern3);

有关详情,请阅读documentation