Подтвердить что ты не робот

Что такое объект класса (java.lang.Class)?

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

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

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

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

4b9b3361

Ответ 1

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

getClass() или class-literal - 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, который содержит метаданные о нем, который доступен во время выполнения.

Ответ 2

Объект 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, позволяют анализировать определенные вами классы, методы, поля, создавать их новые экземпляры, вызывать методы и другие вещи. и они позволяют вам делать это динамически во время выполнения.

Ответ 3

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

Class<?> type = (Class<?>) object;

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

Вот вид верхнего уровня,

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

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

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

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