Различия между классом и файлами * .class? - PullRequest
0 голосов
/ 17 мая 2018

Что-то не понимаю между файлами * .class и API класса Class.Позвольте мне объяснить:

У меня есть файл A.java, представляющий класс java:

public class A { ... }

Class<?> clazz = A.class;

Когда я компилирую A.java, я получаю файл A.class (байт-код).

Существует ли какая-либо связь между файлом A.class (байт-кодом) и clazz, представляющим класс экземпляра (A.class)?Это одно и то же?

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 мая 2018
Class<?> clazz = A.class;

эквивалентно

Class<?> clazz = Class.forName("A");

за исключением того, что для литерала класса, A.class, компилятор проверит, что A доступно и доступно во время компиляции, поэтому его доступность будет обязательной во время выполнения. Поэтому вам не нужно отлавливать отмеченные исключения.

Если A не является абстрактным и имеет конструктор по умолчанию, вы получите то же самое через

Class<?> clazz = new A().getClass();

Конечно, все эти конструкции зависят от доступности определения класса для A во время выполнения, которое обычно поставляется с именем файла класса A.class, но тот факт, что одна из этих конструкций исходного кода выглядит аналогично имя файла не имеет значения.

Обратите внимание, что для вложенных классов представление исходного кода и имя файла будут отличаться, например при использовании Map.Entry.class для ссылки на вложенный тип java.util.Map.Entry имя файла класса будет Map$Entry.class. Вы также можете добавить оператор import для этого класса и обратиться к нему через Entry.class, показывая, что эта конструкция подчиняется стандартным правилам разрешения имен исходного кода и не связана с именем файла скомпилированного класса.

0 голосов
/ 17 мая 2018

*. Файлы классов - это файлы на диске, A.class - это объекты классов в памяти.

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