2012-12-10 48 views
0

我試圖執行下面編寫的代碼和代碼應該拋出一個異常,但它不doint它代碼沒有引發異常

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的一個對象(ALGO爲字符串搜索中的一個) 立方厘米,pattern3被字符數組 STR,圖案都是字符串

爲什麼它不拋出異常,它不是拋NoSuchMethodFound異常意味着它能夠找到方法,我也試圖打印isAccessible,它說假 ,但是當我運行測試時,它不會拋出任何異常

+0

我很困惑,你問它爲什麼不拋出IllegalAccessException發生什麼事?因爲你沒有發現異常? –

+0

其實我想要代碼拋出IllegalAccessException,這就是爲什麼我設置setAccessible爲false。 我想看到我正在測試的算法BNDMWildcardsCI是否能夠處理IllegalAccessException或不... IllegalAcessException是否設置 – Nirav

回答

2

據我所知,如果方法被宣佈爲公開(或以其他方式訪問),setAccessible(false)不能將其設爲私有。如果您擁有私人方法並且您以前稱爲setAccessible(true),它纔有用。

+0

所以有沒有其他方式可以做到這一點? – Nirav

+0

我嘗試過使用下面的SecurityManager SecurityManager SecMgr = new SecurityManager(); SecMgr.checkPackageAccess(「java.lang.reflect.Field」); 但不知道如何撤銷對包中方​​法的權限或撤銷對包自身的訪問 – Nirav

+0

您不能通過SecurityManager直接控制對方法的訪問;你可以使用一個策略文件來創建一個特殊的權限,然後*在該方法中*檢查該權限是否存在(參見[這個答案](http://stackoverflow.com/questions/5486797/how-to-prevent-public -methods-from-being-called-from-specific-classes/5490106#5490106)),但它非常醜陋,而且如果你必須修改公共方法,那麼你可能只是使它不公開。 –

0

方法setAccessible(boolean)工作對象反映不正常的對象。在您的代碼中,您將其設置爲不在ss4對象上的方法對象。

爲了表明我的觀點:

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

你的訪問標誌設置爲false分配給searchCharsMethodss4對象。

至於獎金看到,當你調用

searchCharsMethod.invoke(ss4,cc,pattern3);

欲瞭解更多,請閱讀documentation

+0

它沒有做任何改變.. 但我認爲它不工作是訪問說明是公開的 所以我現在只有一個選擇來限制訪問包java.lang.reflect,並且該限制可以讓我的程序拋出IllegalAccessException – Nirav