2013-07-03 2 views
1

Если у меня есть эти файлы:как же байткод представляет собой еще один класс

//Gizmo.java 
public class Gizmo { 
    public static void main(String[] args) { 
     Gadget g = new Gadget(); 
    } 
} 

.

//Gadget.java 
public class Gadget { 
    public static void main(String[] args) { 
     System.out.println("hello world"); 
    } 
} 

И я скомпилировать их обоих с javac Gizmo.java Gadget.java, то у меня есть вопрос. Как файл Gizmo.class ссылается на класс «Гаджет»? Есть просто строка «Гаджет» где-то в файле?

+1

См http://docs.oracle.com/javase/specs/jvms/se7/html/ –

+2

@JonSkeet Или более конкретно, [JVMs Глава 4] (http://docs.oracle.com/javase /specs/jvms/se7/html/jvms-4.html) – Jeffrey

ответ

1

Ваш ответ лежит в следующей строке JLS4.2.1, который говорит, что:

класса и интерфейса имена, которые появляются в структуре файла класса всегда представлены в полном объеме квалифицированной форме, известной как двоичные имена (JLS §13.1). Такие имена всегда представлены как структуры CONSTANT_Utf8_info (§4.4.7) и, таким образом, могут быть нарисованы, где не более ограничено из всего кодового пространства Юникода. Класс и интерфейс имена ссылаются от структур CONSTANT_NameAndType_info (§4.4.6), которые имеют такие имена как часть их дескриптора (§4.3) и из всех структур CONSTANT_Class_info (§4.4.1).

По историческим причинам синтаксис двоичных имен, которые отображаются в файловых структурах классов , отличается от синтаксиса двоичных имен , задокументированных в JLS §13.1. В этой внутренней форме периоды ASCII (.) , которые обычно разделяют идентификаторы, которые составляют двоичное имя , заменяются косой чертой ASCII (/). Сами идентификаторы должны быть неквалифицированными именами (§4.2.2).

1

Как уже упоминалось комментарии, вы можете найти точное определение формата здесь: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.2

Длинные и короткие его (из моего понимания), что есть UTF-8 строка, которая указывается имя класс, на который ссылаются, и затем я предполагаю, что существует либо a) произвольное число, связанное с ним, либо b) адрес этой строки используется, так что остальная часть файла двоичного класса просто использует это число для ссылки на класс.

Например, если вы скомпилируете код примера в вопросе, а затем откройте Gizmo.class с помощью текстового редактора, вы увидите там строку «Гаджет».

Смежные вопросы