2012-12-10 7 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 (один из для поиска алгоритма String) куб.сма, Pattern3 являются массивами символов ули, картины являются строками

, почему она не бросает исключение, он не бросает исключение NoSuchMethodFound означает, что он может найти метод, и я попытался напечатать isAccessible, и он говорит false , но когда я запускаю тесты, он не вызывает никаких исключений

+0

Я запутался, вы спрашиваете, почему он не бросать IllegalAccessException? потому что вы не поймали это исключение? –

+0

На самом деле я хочу, чтобы код выдавал IllegalAccessException, и именно поэтому я устанавливаю setAccessible как false. Я хочу видеть, что algo, который я тестирую 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); 

Вы установили доступный флаг ложна на объекте, назначенного searchCharsMethod не ss4.

Как бонус видеть то, что происходит, когда вы звоните

searchCharsMethod.invoke(ss4,cc,pattern3);

Для больше, пожалуйста, прочитайте documentation

+0

ничего не меняет. , но я понял, что он не работает. Спецификатор доступа является общедоступным , поэтому у меня есть только один выбор, чтобы ограничить доступ к пакету java.lang.reflect и это ограничение может сделать мою программу броском IllegalAccessException – Nirav

Смежные вопросы