Примитивные типы в Reflection API

1

Всякий раз, когда я пытался использовать примитивный тип типа 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());     
    }
}
  • 0
    « API отражения можно применять только к объектам » - это неправильное предложение. API не применяется к объектам.
  • 0
    boolean.class компилируется как Boolean.TYPE
Теги:
reflection

2 ответа

2
Лучший ответ

getClass() - это метод, определенный в java.lang.Object, и методы могут быть вызваны только в экземплярах.

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

Цитирование с помощью спецификации языка Java 15.8.2. Литералы классов:

Литерал класса - это выражение, состоящее из имени класса, интерфейса, массива или примитивного типа или псевдо-типа void, за которым следует '.' и class токенов.

И, наконец, qutoing из javadoc Class.forName():

Возвращает объект класса, связанный с классом или интерфейсом, с заданным именем строки.

Таким образом Class.forName() работает только для классов и интерфейсов, а не для примитивных типов.

3

Это упоминается в учебниках Oracle Java:

Синтаксис.class

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

boolean b;
Класс c = b.getClass(); //ошибка времени компиляции
Класс c = boolean.class; // верный

Заметим, что оператор boolean.getClass() создаст ошибку времени компиляции, потому что логическое значение является примитивным типом и не может быть разыменовано. Синтаксис.class возвращает класс, соответствующий типу boolean.

Вы должны иметь возможность представлять тип примитивов каким-то образом, поскольку это требуется, когда, например, вы используете отражение для поиска методов или конструкторов с примитивными типами аргументов.

  • 0
    заменяется на boolean.class на Boolean.class.
  • 0
    @Aamir Нет, boolean.class - это не то же самое, что Boolean.class и если вы напишите boolean.class он не будет автоматически заменен Boolean.class .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню