что такое объект Class (java.lang.Class)? - PullRequest
70 голосов
/ 15 декабря 2010

Документация Java для Class гласит:

Class объекты создаются автоматически виртуальной машиной Java при загрузке классов и при вызовах defineClass метод в загрузчике классов.

Что это за Class объекты?Являются ли они такими же, как объекты, созданные в классе с помощью вызова new?

Кроме того, например, object.getClass().getName() как можно все перенести в суперкласс Class, даже если я не наследую от java.lang.Class

Ответы [ 7 ]

85 голосов
/ 15 декабря 2010

Ничего не приведено к Class. Каждый Object в Java принадлежит определенному class. Вот почему класс Object, который наследуется всеми другими классами, определяет метод getClass().

getClass(), или литерал класса - Foo.class возвращает объект Class, который содержит некоторые метаданные о классе:

  • имя
  • пакет
  • Методы
  • поля
  • Конструкторы
  • Аннотации

и некоторые полезные методы, такие как приведение и различные проверки (isAbstract(), isPrimitive() и т. Д.). javadoc показывает, какую именно информацию вы можете получить о классе.

Так, например, если вашему методу присвоен объект, и вы хотите обработать его в случае, если он аннотирован аннотацией @Processable, тогда:

public void process(Object obj) {
    if (obj.getClass().isAnnotationPresent(Processable.class)) {
       // process somehow; 
    }
}

В этом примере вы получаете метаданные о классе данного объекта (чем бы он ни был) и проверяете, есть ли у него данная аннотация. Многие из методов в Class экземпляре называются «отражающими операциями» или просто «отражением». Прочтите здесь об отражении, почему и когда оно используется.

Также обратите внимание, что объект Class представляет перечисления и интерфейсы вместе с классами в работающем приложении Java и имеет соответствующие метаданные.

Подводя итог - каждый объект в Java имеет (принадлежит) класс и имеет соответствующий Class объект, который содержит метаданные о нем, который доступен во время выполнения.

41 голосов
/ 15 декабря 2010

Объект Class является своего рода мета-объектом, описывающим класс объекта. Он используется в основном с возможностями отражения Java. Вы можете думать об этом как о «чертеже» реального класса. Например. У вас есть автомобиль класса, как это:

public class Car {
    public String brand;
}

Затем вы можете построить объект Class, который описывает ваш класс "Car".

Class myCarClass = Class.forName("Car");

Теперь вы можете выполнять любые запросы к классу Car для этого объекта Class:

myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field

и так далее. Каждый объект Java имеет метод getClass (), который возвращает объект Class, описывающий класс объекта Java. Так что вы можете сделать что-то вроде:

Car myCar = new Car();
Class myCarClass  = myCar.getClass();

Это также работает для объектов, которые вы не знаете, например, объекты, которые вы получаете извне:

public void tellMeWhatThisObjectsClassIs(Object obj) {
    System.out.println(obj.getClass().getName());
}

Вы можете передать этому методу любой объект Java, и он напечатает фактический класс объекта, который вы ему дали.

При работе с Java большую часть времени вам не нужно беспокоиться об объектах Class. У них есть несколько удобных вариантов использования. Например. они позволяют программно создавать объекты определенного класса, который часто используется для сериализации и десериализации объектов (например, преобразование объектов Java назад и вперед в / из XML или JSON).

Class myCarClass = Class.forName("Car");
Car myCar = myCarClass.newInstance();  // is roughly equivalent to = new Car();

Вы также можете использовать его, чтобы узнать все объявленные поля или методы вашего класса и т. Д., Что очень полезно в некоторых случаях. Так, например если ваш метод получает неизвестный объект, и вам нужно больше о нем знать, например, если он реализует некоторый интерфейс и т. д., класс Class здесь ваш друг.

Короче говоря, классы Class, Field, Method и т. Д., Которые находятся в пакете java.lang.reflect, позволяют анализировать определенные вами классы, методы, поля, создавать их новые экземпляры, вызывать методы всех видов. других вещей, и они позволяют вам делать это динамически во время выполнения.

8 голосов
/ 15 декабря 2010

getClass() - это метод, который возвращает объект, который является экземпляром java.lang.Class ... при этом не применяется приведение.Кастинг будет выглядеть так:

Class<?> type = (Class<?>) object;
5 голосов
/ 02 мая 2015

Я также хотел бы добавить к ответу ColinD, что getClass вернет тот же объект для экземпляров того же типа.Это напечатает true :

    MyOtherClass foo = new MyOtherClass();
    MyOtherClass bar = new MyOtherClass();
    System.out.println(foo.getClass()==bar.getClass());

Обратите внимание, что это не равно , я использую == .

3 голосов
/ 15 декабря 2010

Объект Class является экземпляром Class (java.lang.Class). Ниже цитата из Javadoc класса должна ответить на ваш вопрос

У класса нет открытого конструктора. Вместо этого объекты Class создаются автоматически виртуальной машиной Java по мере загрузки классов и путем вызова метода defineClass в загрузчике классов.

1 голос
/ 17 мая 2019

Чтобы полностью понять объект класса, давайте вернемся и поймем, что мы получаем объект класса в первую очередь.Вы видите, что каждый файл .java, который вы создаете, когда вы компилируете этот файл .java, jvm будет создавать файл .class, этот файл содержит всю информацию о классе, а именно:

  1. Полное имя класса
  2. Родитель класса
  3. Информация о методе
  4. Переменные поля
  5. Конструктор
  6. Информация о модификаторе
  7. Пул констант

Список, который вы видите выше, - это то, что вы обычно видите в типичном классе.Теперь, до этого момента, ваш файл .java и файл .class существуют на вашем жестком диске, когда вам действительно нужно использовать класс, т.е. выполнить код в методе main(), jvm будет использовать этот файл .classна вашем жестком диске и загрузите его в одну из 5 областей памяти в jvm, которая является областью метода, сразу после загрузки файла .class в область метода, jvm будет использовать эту информацию и объект Class, который представляет тот класс, который существует в области динамической памяти.

Вот представление верхнего уровня,

.java --compile -> .class -> при выполненииваш скрипт -> .class загружается в область метода --jvm создает объект класса из области метода -> объект класса рождается

С объектом класса вы получаете информацию, такую ​​как имя класса, иимена методов, все о классе.

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

Надеюсь, это имеет смысл

1 голос
/ 19 января 2019

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

Класс Object полезен, если вы хотите сослаться на любой объект, тип которого вы не знаете. Обратите внимание, что ссылочная переменная родительского класса может ссылаться на дочерний объект класса, известный как upcasting.

Давайте рассмотрим пример, есть метод getObject (), который возвращает объект, но он может быть любого типа, например Employee, Student и т. Д., Мы можем использовать ссылку на класс Object для ссылки на этот объект. Например:

Object obj=getObject(); // мы не знаем, какой объект будет возвращен этим методом

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