Що означає .class на Java?


149

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



Боюся, я не повністю розумію, про що ви просите. Якщо ви могли б детальніше розібратися, хтось, можливо, зможе надати вам більше корисної інформації
Пол Уокер

28
Це, безумовно, виглядає як справжнє запитання для мене. Я просто задавав це питання собі і опинився тут після швидкого пошуку в Google. Я думаю, я б не турбувався, якби знав, що моє питання не справжнє!
Лікар Джонс

1
Крім того, я думаю, що через незграбність конкретного пошукового рядка, про це запитання є мало написаного чи фінішного. Крім документів API, пов'язаних вище, я ніколи більше не бачив цієї нотації (хоча ви часто бачите, що вона використовується у відображенні).
jordanpg

2
@MadProgrammer OP запитує про .classсинтаксис, який пов'язаний лише випадково з .classрозширенням імені файлу.
jordanpg

Відповіді:


143

Коли ви пишете .classпісля імені класу, він посилається на клас literal - 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 для відображення коду. Як правило, ви можете збирати метадані для свого класу, такі як повна назва класу, список констант, список публічних полів тощо, тощо.

Перевірте ці посилання (вже згадувалося вище), щоб отримати всі деталі:
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 для класу, інакше для використання об'єкта 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());
       }
    }

1

Я думаю, що ключовим тут є розуміння різниці між класом та об'єктом. Об'єкт - це примірник класу. Але повністю об'єктно-орієнтованою мовою Клас є також Об'єктом . Таким чином, виклик .classотримує посилання на об'єкт класу цього класу, з яким потім можна маніпулювати.


4
in a fully object-oriented language, a Class is also an Object? <цитування потрібне>
Сем Дюфель

0

Буквене позначення класу - це вираз, що складається з імені класу, інтерфейсу, масиву або примітивного типу або пустоти псевдотипу, за якою слідує '.' і маркер класу. Однією із змін у 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.