Как ограничить доступ защищенного метода только к подклассам

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

Если любой класс, который не является подклассом и в том же пакете, также должен выдать исключение типа «Защищенный метод».

Редактировать: есть ли способ проверить вызывающий экземпляр имени класса, а затем мы можем проверить, используяэкземпля .

Ответы на вопрос(2)

Решение Вопроса

Удалите все остальные классы из пакета, оставив там только ваш базовый класс.

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

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

if (getClass().getPackage().equals(MyBaseClass.class.getPackage())
    throw new IllegalAccessError(); // or similar

FYIgetClass() дает тебе классthis, который будет классом подкласса.

Edited:

Чтобы найти класс вызывающего абонента, используйте этот код:

Class<?> callerClass = Class.forName(Thread.currentThread().getStackTrace()[2].getClassName());
 Bohemian♦28 мая 2012 г., 22:07
Ты можешь получить класс звонящего, проверивThread.currentThread().getStackTrace(). Смотрите отредактированный ответ
 amicngh28 мая 2012 г., 14:49
Как я могу получить имя класса вызывающего объекта, а затем сравнить его с помощью instanceof.

protectedодификатор @ (подклассы + классы в одном пакете) и модификатор по умолчанию (классы в одном пакете). Третьего варианта нет.

Также вы не можете легко реализовать это во время выполнения, так как не просто найти имя класса и пакет вызывающего кода. Видеть: Как найти вызывающего метода, использующего трассировку стека или отражение?

Один вариант использует AspectJ. Это может даже работать во время компиляции, чтобы отклонить код, пытающийся получить доступ кprotected метод из того же пакета, не будучи подклассом (с помощьюdeclare warning а такжеdeclare error директивы). Вы, вероятно, хотите включить некоторые аннотации во время компиляции, такие как@SubclassesOnly. Видеть: Пересмотр архитектуры времени компиляции: AspectJ, Maven и Eclipse а также Проверка во время компиляции с AspectJ.

Ваш ответ на вопрос