Как компилятор Java находит классы без заголовочных файлов? - PullRequest
4 голосов
/ 28 октября 2010

Когда мы ссылаемся на класс className в jar, как он узнает, определен ли он или нет, когда нет заголовочных файлов (как в c/c++)?

Ответы [ 5 ]

2 голосов
/ 28 октября 2010

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

Однако после их компиляции они не связаны, как у вас в компиляторе C / C ++, так что в основном каждый файл .class является автономным. Конечно, это означает, что вы должны будете предоставить скомпилированный класс, используемый вашей программой, когда вы собираетесь ее выполнить. Так что это немного отличается от того, как C и C ++ готовят исполняемые файлы. У вас вообще нет фазы связывания, она не нужна.

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

На самом деле есть много загрузчиков классов, которые используются JVM с различными разрешениями и свойствами, вы также можете явно вызвать его, чтобы запросить загрузку класса. То, что происходит, также может быть своего рода «ленивой» загрузкой, при которой скомпилированный код .class загружается именно тогда, когда это необходимо (и этот процесс загрузки может выдать ClassNotFoundException, если запрашиваемый класс не находится внутри пути к классам)

2 голосов
/ 28 октября 2010

Когда вы запускаете компилятор Java или само ваше приложение, вы можете указать classpath , в котором перечислены все файлы jar и каталоги, из которых вы загружаете классы. Баночка просто содержит кучу файлов классов; в этих файлах достаточно метаданных, поэтому дополнительные заголовочные файлы не нужны.

1 голос
/ 28 октября 2010

Классы в файле jar содержат всю необходимую информацию (имена классов, сигнатуры методов и т. Д.), Поэтому заголовочные файлы не нужны.

При компиляции нескольких классов javac достаточно умен, чтобы автоматически компилировать зависимоститак что система все еще работает.

0 голосов
/ 28 октября 2010

Java-файлы скомпилированы в файлы классов, которые являются Java-байт-кодом. Эти файлы классов находятся в файловой структуре, где на верхний уровень указывает переменная classpath. Компиляция в C / C ++ создает объектные файлы, которые могут быть связаны в исполняемые файлы. Java компилируется только в файлы байт-кода, которые извлекаются JVM во время выполнения. Ниже приведены дополнительные пояснения.

http://en.wikipedia.org/wiki/Java_bytecode

http://en.wikipedia.org/wiki/Java_compiler

http://en.wikipedia.org/wiki/Java_Virtual_Machine

0 голосов
/ 28 октября 2010

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

...