Что означает .class
в Java? Например, если я создал класс с именем Print
. Что возвращает Print.class
?
Что означает класс в Java?
Ответ 1
Когда вы пишете .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
.class используется, когда экземпляр класса отсутствует.
.getClass() используется, когда имеется экземпляр класса.
object.getClass() возвращает класс данного объекта. Например:
String string = "hello";
System.out.println(string.getClass().toString());
Это приведет к выводу
class java.lang.String
Это класс строкового объекта:)
Ответ 3
Если экземпляр объекта доступен, то самый простой способ получить его класс - вызвать Object.getClass()
Синтаксис .class
Если тип доступен, но экземпляра нет, то можно получить класс, добавив .class
к имени типа. Это также самый простой способ получить класс для примитивного типа.
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
Смотрите: docs.oracle.com о классе
Ответ 4
Просто чтобы уточнить, этот метод ".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, когда начинаете строить свой проект. Это то, что вам нужно после попытки управлять уже работающим кодом. Много раз вам это нужно для управления несколькими экземплярами вашей программы. Может быть, вы хотите идентифицировать каждый конкретный "клон", чтобы определить, что-то уже определено, или подсчитать количество функций, или просто записать детали конкретного экземпляра вашего класса.
Ответ 5
Если экземпляра нет, тогда для получения соответствующего объекта класса для класса используется синтаксис .class
, иначе вы можете использовать метод getClass() для получения объекта класса. Поскольку нет примитивного типа данных, мы должны использовать синтаксис .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());
}
}
Ответ 6
Я думаю, что ключевым здесь является понимание разницы между классом и объектом. Объект - это экземпляр класса. Но в полностью объектно-ориентированном языке класс также является Object. Поэтому вызов .class
получает ссылку на объект класса этого класса, который затем можно манипулировать.
Ответ 7
Литерал класса - это выражение, состоящее из имени класса, интерфейса, массива или примитивного типа или псевдодальности типа 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