Закрытый пакетный файл в .java-файле - почему он доступен? - PullRequest
3 голосов
/ 03 октября 2011

Рассмотрим следующий код, где класс HelloWorld имеет доступ по умолчанию или частный доступ к пакету:

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
    }
}

И предположим, что приведенный выше код сохранен в файле с именем HelloWorld.java.Итак, мой вопрос: поскольку HelloWorld теперь является закрытым для пакета классом, как он работает?* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '*' '' '' '»' '."Путаница возникает только тогда, когда она объявлена ​​с закрытым доступом по умолчанию для пакета.

Ответы [ 4 ]

6 голосов
/ 03 октября 2011

Запуск JVM описан в §12.1 Запуск виртуальной машины JLS .

Обратите внимание, что в этой главе ничего не сказано о проверках видимости класса. Это only указывает, что main метод должен быть public.

Это означает, что просто нет проверки на видимость на уровне класса (что имеет смысл, поскольку еще нет контекста для проверки видимости: в каком «пакете» находится «вызывающий»?).

1 голос
/ 02 июня 2012

Вероятно, разработчики JLS решили, что нет необходимости ограничивать доступ к методу main, если вы знаете имя класса, хотя на первый взгляд это выглядит нелогичным; с другой стороны - доступ всегда можно получить с помощью отражения, поэтому его нельзя рассматривать как дыру в безопасности ... Во всяком случае, например создавая фасад для частного класса пакета, мы обращаемся к нему косвенно ... Таким образом, защита скорее от неправильного использования и допускает дальнейшие изменения.

1 голос
/ 03 октября 2011

Вы не очень ясно дали понять, но я предполагаю, что ваш вопрос заключается в том, почему этот основной метод можно запустить при вводе java HelloWorld в командной строке.

Ответ таков: Спецификация языка Java просто не требует, чтобы класс, содержащий основной метод, был общедоступным.Модификаторы доступа - это языковой механизм, предназначенный главным образом для обеспечения возможности сопровождения посредством инкапсуляцииОни на самом деле не особенность безопасности и, конечно, не непоколебимые законы физики.Механизм запуска JVM просто игнорирует их.

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

1 голос
/ 03 октября 2011

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

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

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