Страницы

Поиск по вопросам

понедельник, 4 февраля 2019 г.

Reflections: анализ модификаторов метода

Мне необходимо выделить из класса protected-методы. Я получаю массив Method[] из метода Class.getDeclaredMethods(), затем анализирую объекты массива. Есть метод Method.getModifiers(), который возвращает, как я понимаю, одну из статических констант класса Modifier. Прикол в том, что у метода модификаторов может быть несколько (типа public static), а у меня в распоряжении только один. Как так то?


Ответ

Метод getModifiers() возвращает битовую маску — самый простой способ представления множества значений (эдакий EnumSet для бедных). Каждый отдельный модификатор в этой битовой маске — это отдельный бит. Например, public — самый младший (нулевой) бит, private — следующий за ним (первый) и так далее. Чтобы проверять, установлен ли i-й бит в битовой маске, надо проверить на ноль результат операции (modifiers & (1 << n)), где n — это номер бита. Для упрощения обычно для возможных значений (1 << n) заводят подходящие константы, которые как раз есть в классе Modifier
Modifier.PUBLIC = 1 << 0 = 1 Modifier.PRIVATE = 1 << 1 = 2 Modifier.PROTECTED = 1 << 2 = 4
И так далее. Соответственно, чтобы узнать, например, объявлен ли метод protected, надо проверить условие method.getModifiers() & Modifier.PROTECTED != 0. Именно это и делают вспомогательные статические методы в классе Modifier, поэтому можно писать ещё проще: Modifier.isProtected(method.getModifiers())

Комментариев нет:

Отправить комментарий