Что означает .class в Java?

149

Что .classзначит в Java? Например, если я создал класс с именем Print. Что Print.classвозвращает?

Куинн Вэй
источник
Боюсь, я не до конца понимаю, что вы спрашиваете. Если бы вы могли уточнить немного, кто-то может предоставить вам более полезную информацию
Пол Уокер
28
Это, конечно, выглядит как настоящий вопрос для меня. Я просто задавал этот вопрос сам и оказался здесь после быстрого поиска в Google. Думаю, мне не стоило беспокоиться, если бы я знал, что мой вопрос не был реальным!
Доктор Джонс
1
Кроме того, я думаю, что из-за неловкости конкретной строки поиска об этом вопросе мало что написано или найдено. Кроме документации по API, на которую ссылаются выше, я никогда не видел ни одной упомянутой нотации (хотя вы часто видите, что она используется в отражении).
jordanpg
2
@MadProgrammer ОП спрашивает о .classсинтаксисе, который только случайно связан с .classрасширением имени файла.
jordanpg

Ответы:

143

Когда вы пишете .classпосле имени класса, оно ссылается на литерал класса - java.lang.Classобъект, который представляет информацию о данном классе.

Например, если ваш класс Print, то Print.classесть объект , который представляет класс Printна время выполнения. Это тот же объект, который возвращается getClass()методом любого (прямого) экземпляра Print.

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
Хавьер
источник
2
Что можно сделать с объектом класса?
Кевин
7
@Kevin См. Документацию API для java.lang.Class .
Патриция Шанахан
Применение: получение доступа к закрытым полей, например: Writer.class.getDeclaredField("writeBuffer").
jordanpg
2
Так какой тип Print.class?
Жипенг Ян
1
А как Android справляется new Intent(this, Activity.class? Будет ли он пытаться выяснить, class Activityсравнивая каждый класс?
Жипенг Янг
56

.class используется, когда нет доступного экземпляра класса.

.getClass() используется, когда есть доступный экземпляр класса.

object.getClass() возвращает класс данного объекта.

Например:

String string = "hello";
System.out.println(string.getClass().toString());

Это выведет:

class java.lang.String

Это класс строкового объекта :)

Кристофер
источник
7
getClass()полезно только если у вас есть ссылка, указывающая на объект класса. ClassName.classможет использоваться, даже если у класса нет экземпляров. Например, рассмотрим Math.class. Каждый правильный для определенных ситуаций.
Патриция Шанахан
Блестящее объяснение. Прямо в точку. Любите, как вы определили различие между .classи.getClass().
Севастян Саванюк
6

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

.classСинтаксис

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

boolean b;
Class c = b.getClass();   // compile-time error

Class c = boolean.class;  // correct

Смотрите: docs.oracle.com о классе

Андрей
источник
6

Просто чтобы уточнить, этот метод «.class» не относится к файлу байт-кода, который вы видите после компиляции кода Java, а также к путанице между концепциями класса и объекта в теории ООП.

Этот метод .class используется в Java для отражения кода. Как правило, вы можете собирать метаданные для своего класса, такие как полное имя класса, список констант, список открытых полей и т. Д. И т. Д.

Проверьте эти ссылки (уже упоминалось выше), чтобы получить все подробности:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html

Обычно вы не планируете сразу использовать Reflection, когда начинаете строить свой проект. Это то, что вам нужно после попытки управлять уже работающим кодом. Много раз вам это нужно для управления несколькими экземплярами вашей программы. Может быть, вы хотите идентифицировать каждый конкретный «клон», чтобы определить, что-то уже определено, или подсчитать количество функций, или просто записать детали конкретного экземпляра вашего класса.

Сальвадор Валенсия
источник
3

Если доступного экземпляра нет, то .classсинтаксис используется для получения соответствующего объекта Class для класса, в противном случае вы можете использовать метод getClass () для получения объекта Class. Поскольку не существует экземпляра примитивного типа данных, мы должны использовать .classсинтаксис для примитивных типов данных.

    package test;

    public class Test {
       public static void main(String[] args)
       {
          //there is no instance available for class Test, so use Test.class
          System.out.println("Test.class.getName() ::: " + Test.class.getName());

          // Now create an instance of class Test use getClass()
          Test testObj = new Test();
          System.out.println("testObj.getClass().getName() ::: " + testObj.getClass().getName());

          //For primitive type
          System.out.println("boolean.class.getName() ::: " + boolean.class.getName());
          System.out.println("int.class.getName() ::: " + int.class.getName());
          System.out.println("char.class.getName() ::: " + char.class.getName());
          System.out.println("long.class.getName() ::: " + long.class.getName());
       }
    }
Ranjeet
источник
1

Я думаю, что ключом здесь является понимание различия между классом и объектом. Объект является экземпляром класса. Но в полностью объектно-ориентированном языке класс также является объектом . Таким образом, вызов .classполучает ссылку на объект Class этого класса, которым затем можно манипулировать.

Ксеркс
источник
4
in a fully object-oriented language, a Class is also an Object? <цитата нужна>
Сэм Дюфель
0

Литерал класса - это выражение, состоящее из имени класса, интерфейса, массива или типа примитива или псевдотипа void, за которым следует '.' и класс токенов. Одним из изменений в JDK 5.0 является то, что класс java.lang.Class является универсальным java.lang.Class Class<T>, поэтому:

Class<Print> p = Print.class;

Ссылки здесь:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

http://docs.oracle.com/javase/tutorial/extra/generics/literals.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.2

PbxMan
источник