Можно ли запечатать классы в jar-файле?
Итак, я знаю, что можно запечатать пакет в jar-файле, установив для атрибута sealed значение true, но возможно ли сделать то же самое с записями классов в манифесте?
Будет ли работать этот закрытый атрибут ниже, если Boot.class существует или он предназначен только для пакетов?
Пример:
Манифест-Версия: 1.0 Имя: com/myCompany/randompackage/Boot.class Запечатано: правда
1 ответ
Нет смысла запечатывать класс. Вы можете запечатать только пакет, потому что только пакет нуждается в защите. Нет необходимости защищать класс, потому что невозможно распространить содержимое одного класса на два файла. Можно только распределить классы одного пакета по двум JAR-файлам. И запечатывание означает предотвращение этого. И хотя это не значение по умолчанию, хорошая идея сделать его установленным по умолчанию.
пример
Алиса пишет пакет под названием alice
, который содержит два класса alice.Data
а также alice.Work
, Класс Data содержит некоторые переменные, которые нельзя изменять. В противном случае код в классе Work может завершиться ошибкой. Алиса объявляет класс Data как частный пакет, потому что класс Work должен иметь доступ к данным. Теперь она помещает оба класса пакета в JAR под названием alice.jar
и дает банку Бобу.
Но Бобу нужно сделать больше и попросить Мэллори написать еще один класс, потому что Алиса уже работает над чем-то другим. Так Мэллори пишет пакет под названием mallory
и реализует необходимый класс под названием mallory.Work
, Но Мэллори завидует и хочет дискредитировать Алису и пишет еще один класс под названием alice.Anger
, И она помещает оба класса в банку под названием mallory.jar
и дает банку Бобу.
Боб использует оба JAR-файла и сталкивается с проблемами с кодом Алисы, потому что класс alice.Anger
от mallory.jar
имеет частный доступ к пакету alice
и разрушает данные в alice.Data
,
Если бы Алиса запечатала свой JAR, Мэллори не смогла бы поставить класс в mallory.jar
который принадлежит пакету alice
, Java отклонит этот JAR, потому что уже есть другой JAR, содержащий пакет alice
и каждый пакет должен быть только в одном банке.