Всякий раз, когда я пытался использовать примитивный тип типа boolean
с синтаксисом Class.forName()
и с getClass()
, генерировалась ошибка компиляции, но когда я использовал синтаксис .class
, он работал, и результат был boolean
.
Мой вопрос в том, почему он работает с синтаксисом .class
? Я думал, что всегда должен существовать объект вместо String
в String.class
.
public class reflect2
{
public static void main(String[] args)
{
Class c1 = boolean.class;
System.out.println(c1.getName());
}
}
getClass()
- это метод, определенный в java.lang.Object
, и методы могут быть вызваны только в экземплярах.
.class
является частью литерала класса, это не вызов метода, и допускается на примитивных типов тоже.
Цитирование с помощью спецификации языка Java 15.8.2. Литералы классов:
Литерал класса - это выражение, состоящее из имени класса, интерфейса, массива или примитивного типа или псевдо-типа
void
, за которым следует'.'
иclass
токенов.
И, наконец, qutoing из javadoc Class.forName()
:
Возвращает объект класса, связанный с классом или интерфейсом, с заданным именем строки.
Таким образом Class.forName()
работает только для классов и интерфейсов, а не для примитивных типов.
Это упоминается в учебниках Oracle Java:
Синтаксис.class
Если тип доступен, но нет экземпляра, тогда можно получить класс, добавив ".class" к названию типа. Это также самый простой способ получить класс для примитивного типа.
boolean b;
Класс c = b.getClass(); //ошибка времени компиляции
Класс c = boolean.class; // верныйЗаметим, что оператор boolean.getClass() создаст ошибку времени компиляции, потому что логическое значение является примитивным типом и не может быть разыменовано. Синтаксис.class возвращает класс, соответствующий типу boolean.
Вы должны иметь возможность представлять тип примитивов каким-то образом, поскольку это требуется, когда, например, вы используете отражение для поиска методов или конструкторов с примитивными типами аргументов.
boolean.class
- это не то же самое, что Boolean.class
и если вы напишите boolean.class
он не будет автоматически заменен Boolean.class
.