Как заставить Class.getMethod () генерировать исключение SecurityException - PullRequest
8 голосов
/ 21 февраля 2012

У меня есть служебный метод, чтобы найти метод получения объекта для определенного поля (используя отражение):

public static Method findGetter(final Object object, final String fieldName) {
    if( object == null ) {
        throw new NullPointerException("object should not be null");
    } else if( fieldName == null ) {
        throw new NullPointerException("fieldName should not be null");
    }

    String getterName = getMethodNameForField(GET_PREFIX, fieldName);

    Class<?> clazz = object.getClass();
    try {
        return clazz.getMethod(getterName);
    } catch(final NoSuchMethodException e) {
        // exception handling omitted
    } catch(final SecurityException e) {
        // exception handling omitted
    }
}

Я хотел бы написать модульный тест, охватывающий сценарий SecurityException , но как я могу заставить getMethod вызвать SecurityException?

Javadoc утверждает, что getMethod сгенерирует исключение SecurityException

Если присутствует менеджер безопасности s и любое из следующего условия выполнены:

  • вызов s.checkMemberAccess (this, Member.PUBLIC) запрещает доступ к методу

  • загрузчик класса вызывающего не совпадает или не является предком загрузчика класса для текущего класса и вызова s.checkPackageAccess () запрещает доступ к пакету этого класса

Я бы предпочел вызвать исключение в обычном режиме, а не прибегать к насмешливой структуре.

Ответы [ 2 ]

11 голосов
/ 21 февраля 2012
System.setSecurityManager(new SecurityManager(){
    @Override
    public void checkMemberAccess(Class<?> clazz, int which) {
        throw new SecurityException("Not allowed")
    }
    @Override
    public void checkPermission(Permission perm) {
        // allow resetting the SM
    }
});
ClassTest.class.getMethod("foo");

Не забудьте вызвать System.setSecurityManager(null) в блоке finally, чтобы восстановить исходное состояние.

0 голосов
/ 21 февраля 2012

Если вызывать это в обычных условиях, очень мало случаев, когда это может произойти.

Непубличные методы приведут к NoSuchMethodException, потому что getMethod специально ищет только открытые методы. getDeclaredMethod найдет метод, но разрешит возврат приватных / защищенных методов.

Единственный реальный способ сделать это - это, как говорят javadocs, иметь отдельный пакет, защищенный менеджером безопасности, который, как я предполагаю, может быть сделан только с неподписанными апплетами или аналогичными разрешениями. (Я никогда не сталкивался с этим сам, поэтому я не совсем уверен)

Ваша лучшая ставка заключается в том, чтобы исключение создавалось для определенных методов путем переопределения диспетчера безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...