Работа с ключевым словом class в Java

Я действительно не понимаю, как работают ключевые слова class.

Например, метод get(ClientResponse.class) принимает значение ClientResponse.class. Как он использует это, когда он его получает, и каковы преимущества перед тем, как просто передать его экземпляр?

Ответ 1

SomeClass.class

возвращает объект класса Java. Класс обобщен, поэтому фактический тип SomeClass.class будет Class<SomeType>.

Для этого объекта много применений, и вы можете прочитать Javadoc для него здесь: http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html

Ответ 2

В ClientResponse.class, class не является ключевым словом, не является статическим полем в классе ClientResponse.

Ключевое слово - это тот, который мы используем для определения класса в Java. например.

public class MyClass { } /* class used here is one of the keywords in Java */

class в ClientResponse.class является кратким отрезком к экземпляру Class<T>, который представляет класс ClientResponse.

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

ClientResponse obj = new ClientResponse();
Class clazz = obj.getClass(); 

Какое преимущество перед тем, как просто передать его экземпляр?

В приведенном выше примере вы можете увидеть, что произойдет в случае, если obj был нулевым (NPE). Тогда не будет способа для метода получить ссылку на экземпляр class для ClientResponse.

Ответ 3

Самый важный факт - вам не нужно иметь экземпляр для вызова метода. Это критически полезно в ситуациях, когда вы не можете каким-либо образом создать экземпляр класса, например. он абстрактный или имеет только частный конструктор или может быть только правильно создан какой-то структурой, например Spring или JSF.

Затем вы можете вызвать get, чтобы получить объект запрашиваемого типа, даже не зная, откуда он появился и как он создается.

Ответ 4

Класс Class, отличный от ключевого слова Class, представляет собой метаданные, описывающие экземпляры. Он расскажет вам о методах, членах данных, конструкторах и других функциях экземпляров, созданных вами, вызывая new.

Например, метод get (ClientResponse.class) принимает ClientResponse.class, как он использует это, когда он получает его и что являются преимуществом перед тем, как просто передать его экземпляр?

Вы не можете передать экземпляр ClientResponse этому методу; он ожидает метаданных обо всех экземплярах ClientResponse. Если вы передали экземпляр, вы ожидаете, что метод может изменить состояние этого экземпляра. Но передача метаданных обо всех экземплярах может позволить методу создать новый тип экземпляра (например, динамический прокси) или сделать что-то еще, что зависит от метаданных обо всех экземплярах ClientResponse. См. Разницу?

Ответ 5

Класс является "планом" объекта. Экземпляр - это объект.

Если мы имеем

public class SomeClass {
   int a;
   SomeClass(int a) {
      this.a = a
   }
}

Мы можем иметь экземпляр этого класса

SomeClass c = new SomeClass(10);

c - это экземпляр класса. Он имеет целое число a со значением 10.

Объект SomeClass.class представляет a Class.

Здесь SomeClass.class - это object типа Class, который имеет информацию о том, что SomeClass

  • a конкретный класс с
  • один конструктор
  • с переменной целочисленным членом

    и многое другое metadata о классе SomeClass. Обратите внимание, что для a оно не имеет значения.

Вы должны использовать get(c), если вы планируете что-то сделать с instance of c как вызов c.a или другие полезные функции для manupulate/получения данных экземпляра.

Вы должны использовать get(SomeClass.class), когда get возвращает что-то, основанное на том факте, что аргумент представляет собой некоторый тип класса. Например, если это метод класса Registry, который имеет карту, которая извлекает implementation class на основе типа переданного класса.

Ответ 6

Здесь ClientResponse.class - это экземпляр Class<ClientResponse>. Обычно объект Class представляет тип объекта. Когда вы создаете новый экземпляр:

Object obj = new ClientResponse()

вы можете получить класс (тип) этого объекта, вызвав:

obj.getClass()

Итак, зачем вам проходить объекты Class вокруг? Это менее распространено, но одна из причин - позволить некоторому методу создать произвольное количество экземпляров данного класса:

ClientResponse resp = ClientResponse.newInstance();

Ответ 7

Существует много способов использования объектов класса. Это используется для отражения. Ниже приведена ссылка, которая поможет вам понять больше.

http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html

Ответ 8

Всякий раз, когда мы скомпилируем любой файл Java, компилятор будет вставлять в испускаемый байт код public, static, final с именем class типа java.lang.Class. Поскольку это поле public и static, мы можем получить к нему доступ с использованием точечной нотации вместе с именем класса, так как в вашем случае это ClientResponse.class.