Java - Удаляется ли инструкция пакета в файле .class? - PullRequest
0 голосов
/ 18 января 2019

Поскольку мы знаем, что оператор package запускается командой javac, он создает связанные каталоги в соответствии с именем пакета.

Например:

// MyClassB.java
package abc.xyz;

class MyClassA{
  // ...
}

class MyClassB{
  // ...
}

Теперь, когда я скомпилирую этот файл:

javac -d . MyClassB.java

После компиляции у нас будет следующая структура каталогов с файлами .class.

/
 |___ abc
    |___ xyz
        |___ MyClassA.class
        |___ MyClassB.class

Сейчасвопрос в том, содержат ли они MyClassA.class и MyClassB.class только скомпилированный байт-код класса MyClassA и MyClassB?

А как насчет следующего оператора?

package abc.xyz;

Удалено ли это утверждение во время компиляции?Или этот оператор удаляется только из класса MyClassA и остается в классе MyClassB, поскольку имя файла было MyClassB.java.Или, возможно, файл MyClassB.class содержит только байт-код класса MyClassB после компиляции, а package abc.xyz; также удаляется во время компиляции?Если package abc.xyz; не будет удален во время компиляции, тогда будет проблема, когда мы будем использовать этот файл во время выполнения, потому что механизм времени выполнения также вызовет версию байт-кода оператора package abc.xyz;, поэтому это будет проблемой.Или это убрано во время компиляции?Или байт-код создается только для классов, но не для файла, который содержит оператор package abc.xyz;, в результате чего package abc.xyz; не становится частью файлов .class.

Изображениениже четко объясняется вопрос: enter image description here

Может кто-нибудь объяснить, каков сценарий этого?Это моя скромная просьба к авторам не отрицательно пометить мой вопрос, потому что у меня есть некоторые заблуждения относительно java, поэтому я хочу прояснить свою концепцию. Если мой вопрос все еще может быть отрицательным, то это нормально, но, по крайней мере, ответьтеа также.

Спасибо !!!

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Если вы откроете файл .class любого из ваших классов, вы сможете увидеть детали пакета внутри него. В вашем случае, если вы откроете MyClassA.class в текстовом редакторе, то вы увидите что-то вроде abc/xyz/MyClassA. JVM будет использовать его как abc.xyz.MyClassA. По этой причине, если нам нужно использовать этот класс в каком-то другом классе, нам нужно использовать его как import abc.xyz.MyClassA.

0 голосов
/ 24 января 2019
Директивы

, такие как объявление package, а также операторы import, вообще не генерируют никакого кода, они только влияют на то, как компилятор будет обрабатывать имена в одной и той же единице компиляции.

Так что декларация вроде

package abc.xyz;

public class MyClassA {

}

создает класс с полным именем abc.xyz.MyClassA или класс с простым именем MyClassA в пакете abc.xyz; оба означают одно и то же.

Полное имя хранится в файле .class, который является единственной соответствующей информацией для JVM.

Существует соглашение для хранения такого файла как SimpleName.class в каталоге, полученном из имени пакета, то есть abc/xyz/MyClassA.class, присоединенного javac и используемого стандартными загрузчиками классов для поиска файл, когда запрашивается класс с таким именем. Очевидно, что такое соглашение облегчает жизнь.

В принципе, возможны другие способы хранения, и некоторые из них известны. Начиная с Java 9, эталонная реализация имеет формат изображения модуля, до этого был «архив данных общего класса», далее был «Pack200», формат архива, который не рекомендуется для удаления с JDK 11.

Обратите внимание, что даже jar-файлы, которые являются расширенными zip-файлами, не совсем то, что вы видите. Zip-файл состоит из линейной последовательности файловых записей, имеющих полное имя, поэтому в вашем случае у вас будет две записи, сообщающие об их именах как abc/xyz/MyClassA.class и abc/xyz/MyClassB.class, тогда как любая структура каталогов, показанная инструментами, на самом деле получается из этих имена и не подразумевает, что вложенные записи для abc и xyz действительно существуют. Тем не менее, стандартный загрузчик классов также будет использовать эти записи так же, как если бы существовала эта структура каталогов, поэтому нет проблем с тем, чтобы сохранить структуру каталогов в файле zip / jar.

Но начиная с Java 9, для одного и того же класса могут быть разные версии, которые будут выбраны в зависимости от текущей версии Java. Используемая для этого схема именования не является частью соглашения, используемого javac при хранении файлов.

0 голосов
/ 18 января 2019

Он не никуда , он компилируется как class abc.xyz.MyClassA.Вы можете увидеть, что если вы декомпилируете .class, например, используя javap.

...