我正在尝试执行下面编写的代码,代码应该抛出一个异常,但它不是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 但是当我运行测试时,它不会抛出任何异常
答案 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