Боюсь, я не до конца понимаю, что вы спрашиваете. Если бы вы могли уточнить немного, кто-то может предоставить вам более полезную информацию
Пол Уокер
28
Это, конечно, выглядит как настоящий вопрос для меня. Я просто задавал этот вопрос сам и оказался здесь после быстрого поиска в Google. Думаю, мне не стоило беспокоиться, если бы я знал, что мой вопрос не был реальным!
Доктор Джонс
1
Кроме того, я думаю, что из-за неловкости конкретной строки поиска об этом вопросе мало что написано или найдено. Кроме документации по API, на которую ссылаются выше, я никогда не видел ни одной упомянутой нотации (хотя вы часто видите, что она используется в отражении).
jordanpg
2
@MadProgrammer ОП спрашивает о .classсинтаксисе, который только случайно связан с .classрасширением имени файла.
jordanpg
Ответы:
143
Когда вы пишете .classпосле имени класса, оно ссылается на литерал класса -
java.lang.Classобъект, который представляет информацию о данном классе.
Например, если ваш класс Print, то Print.classесть объект , который представляет класс Printна время выполнения. Это тот же объект, который возвращается getClass()методом любого (прямого) экземпляра Print.
getClass()полезно только если у вас есть ссылка, указывающая на объект класса. ClassName.classможет использоваться, даже если у класса нет экземпляров. Например, рассмотрим Math.class. Каждый правильный для определенных ситуаций.
Патриция Шанахан
Блестящее объяснение. Прямо в точку. Любите, как вы определили различие между .classи.getClass().
Севастян Саванюк
6
Если экземпляр объекта доступен, то самый простой способ получить его класс - это вызвать Object.getClass()
.classСинтаксис
Если тип доступен, но экземпляра нет, то можно получить класс, добавив .classимя типа. Это также самый простой способ получить класс для примитивного типа.
boolean b;Class c = b.getClass();// compile-time errorClass c =boolean.class;// correct
Просто чтобы уточнить, этот метод «.class» не относится к файлу байт-кода, который вы видите после компиляции кода Java, а также к путанице между концепциями класса и объекта в теории ООП.
Этот метод .class используется в Java для отражения кода. Как правило, вы можете собирать метаданные для своего класса, такие как полное имя класса, список констант, список открытых полей и т. Д. И т. Д.
Обычно вы не планируете сразу использовать Reflection, когда начинаете строить свой проект. Это то, что вам нужно после попытки управлять уже работающим кодом. Много раз вам это нужно для управления несколькими экземплярами вашей программы. Может быть, вы хотите идентифицировать каждый конкретный «клон», чтобы определить, что-то уже определено, или подсчитать количество функций, или просто записать детали конкретного экземпляра вашего класса.
Если доступного экземпляра нет, то .classсинтаксис используется для получения соответствующего объекта Class для класса, в противном случае вы можете использовать метод getClass () для получения объекта Class. Поскольку не существует экземпляра примитивного типа данных, мы должны использовать .classсинтаксис для примитивных типов данных.
package test;publicclassTest{publicstaticvoid main(String[] args){//there is no instance available for class Test, so use Test.classSystem.out.println("Test.class.getName() ::: "+Test.class.getName());// Now create an instance of class Test use getClass()Test testObj =newTest();System.out.println("testObj.getClass().getName() ::: "+ testObj.getClass().getName());//For primitive typeSystem.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получает ссылку на объект Class этого класса, которым затем можно манипулировать.
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
синтаксисе, который только случайно связан с.class
расширением имени файла.Ответы:
Когда вы пишете
.class
после имени класса, оно ссылается на литерал класса -java.lang.Class
объект, который представляет информацию о данном классе.Например, если ваш класс
Print
, тоPrint.class
есть объект , который представляет классPrint
на время выполнения. Это тот же объект, который возвращаетсяgetClass()
методом любого (прямого) экземпляраPrint
.источник
Writer.class.getDeclaredField("writeBuffer")
.Print.class
?new Intent(this, Activity.class
? Будет ли он пытаться выяснить,class Activity
сравнивая каждый класс?.class
используется, когда нет доступного экземпляра класса..getClass()
используется, когда есть доступный экземпляр класса.object.getClass()
возвращает класс данного объекта.Например:
Это выведет:
Это класс строкового объекта :)
источник
getClass()
полезно только если у вас есть ссылка, указывающая на объект класса.ClassName.class
может использоваться, даже если у класса нет экземпляров. Например, рассмотримMath.class
. Каждый правильный для определенных ситуаций..class
и.getClass().
Если экземпляр объекта доступен, то самый простой способ получить его класс - это вызвать
Object.getClass()
.class
СинтаксисЕсли тип доступен, но экземпляра нет, то можно получить класс, добавив
.class
имя типа. Это также самый простой способ получить класс для примитивного типа.Смотрите: docs.oracle.com о классе
источник
Просто чтобы уточнить, этот метод «.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, когда начинаете строить свой проект. Это то, что вам нужно после попытки управлять уже работающим кодом. Много раз вам это нужно для управления несколькими экземплярами вашей программы. Может быть, вы хотите идентифицировать каждый конкретный «клон», чтобы определить, что-то уже определено, или подсчитать количество функций, или просто записать детали конкретного экземпляра вашего класса.
источник
Если доступного экземпляра нет, то
.class
синтаксис используется для получения соответствующего объекта Class для класса, в противном случае вы можете использовать метод getClass () для получения объекта Class. Поскольку не существует экземпляра примитивного типа данных, мы должны использовать.class
синтаксис для примитивных типов данных.источник
Я думаю, что ключом здесь является понимание различия между классом и объектом. Объект является экземпляром класса. Но в полностью объектно-ориентированном языке класс также является объектом . Таким образом, вызов
.class
получает ссылку на объект Class этого класса, которым затем можно манипулировать.источник
in a fully object-oriented language, a Class is also an Object
? <цитата нужна>Литерал класса - это выражение, состоящее из имени класса, интерфейса, массива или типа примитива или псевдотипа void, за которым следует '.' и класс токенов. Одним из изменений в JDK 5.0 является то, что класс java.lang.Class является универсальным
java.lang.Class Class<T>
, поэтому:Ссылки здесь:
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
источник