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

7

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

Если какой-либо класс, который не является подклассом и находится в том же пакете, также должен выдать исключение, например & quot; Защищенный метод. & Quot;

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

Ваш Ответ

2   ответа
3

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

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

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

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

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

Edited:

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

Class<?> callerClass = Class.forName(Thread.currentThread().getStackTrace()[2].getClassName());
Error: User Rate Limit Exceeded amicngh
Error: User Rate Limit ExceededThread.currentThread().getStackTrace()Error: User Rate Limit Exceeded
7

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

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

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

Похожие вопросы