Що .class
означає Java? Наприклад, якщо я створив клас з назвою Print
. Що Print.class
повертає?
.class
синтаксис, який пов'язаний лише випадково з .class
розширенням імені файлу.
Що .class
означає Java? Наприклад, якщо я створив клас з назвою Print
. Що Print.class
повертає?
.class
синтаксис, який пов'язаний лише випадково з .class
розширенням імені файлу.
Відповіді:
Коли ви пишете .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());
Writer.class.getDeclaredField("writeBuffer")
.
Print.class
?
new Intent(this, Activity.class
? Чи спробує це з’ясувати, class Activity
порівнюючи кожен клас?
.class
використовується, коли немає наявного примірника класу.
.getClass()
використовується, коли є екземпляр класу.
object.getClass()
повертає клас заданого об'єкта.
Наприклад:
String string = "hello";
System.out.println(string.getClass().toString());
Це виведе:
class java.lang.String
Це клас об'єкта рядка :)
getClass()
корисний лише у тому випадку, якщо у вас є посилання, що вказує на об’єкт класу. ClassName.class
може використовуватися, навіть якщо у класу немає екземплярів. Наприклад, розглянемо Math.class
. Кожен правильний для певних ситуацій.
.class
і.getClass().
Якщо доступний примірник об'єкта, найпростіший спосіб отримати його Клас - це викликати Object.getClass()
.class
синтаксис
Якщо тип доступний, але примірника немає, то клас можна отримати, додавши .class
ім'я типу. Це також найпростіший спосіб отримати Клас для примітивного типу.
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
Дивіться: docs.oracle.com про клас
Для уточнення, цей метод.
Цей метод ".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 одразу, коли починаєте створювати проект. Це щось, що вам відомо, що вам потрібно, намагаючись керувати вже працюючим кодом. Багато разів вам це потрібно для управління кількома екземплярами вашої програми. Можливо, ви хочете ідентифікувати кожен конкретний "клон", щоб визначити, чи щось вже визначено, або порахувати кількість функцій, або просто записати дані конкретного примірника вашого класу.
Якщо немає примірника, .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());
}
}
Я думаю, що ключовим тут є розуміння різниці між класом та об'єктом. Об'єкт - це примірник класу. Але повністю об'єктно-орієнтованою мовою Клас є також Об'єктом . Таким чином, виклик .class
отримує посилання на об'єкт класу цього класу, з яким потім можна маніпулювати.
in a fully object-oriented language, a Class is also an Object
? <цитування потрібне>
Буквене позначення класу - це вираз, що складається з імені класу, інтерфейсу, масиву або примітивного типу або пустоти псевдотипу, за якою слідує '.' і маркер класу. Однією із змін у 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