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
, показывая, что эта конструкция подчиняется стандартным правилам разрешения имен исходного кода и не связана с именем файла скомпилированного класса.