Obawiam się, że nie do końca rozumiem, o co pytasz. Gdybyś mógł rozwinąć trochę więcej, ktoś mógłby udzielić ci bardziej przydatnych informacji
Paul Walker,
28
To z pewnością wygląda na prawdziwe pytanie. Właśnie zadawałem to pytanie i znalazłem się tutaj po szybkim wyszukiwaniu w Google. Chyba nie zawracałbym sobie głowy, gdybym wiedział, że moje pytanie nie jest prawdziwe!
Doctor Jones,
1
Myślę też, że z powodu niezręczności konkretnego ciągu wyszukiwania, niewiele jest napisanych lub możliwych do znalezienia na temat tego pytania. Poza dokumentacją API, do której linkowano powyżej, nigdy nie widziałem tej notacji wspomnianej nigdzie indziej (chociaż często widzisz ją w refleksji).
jordanpg
2
@MadProgrammer OP pyta o .classskładnię, która jest tylko przypadkowo związana z .classrozszerzeniem nazwy pliku.
jordanpg
Odpowiedzi:
143
Kiedy piszesz .classpo nazwie klasy, odwołuje się ona do literału klasy -
java.lang.Classobiektu, który reprezentuje informacje o danej klasie.
Na przykład, jeśli twoja klasa to Print, to Print.classjest obiektem, który reprezentuje klasę Printw czasie wykonywania. Jest to ten sam obiekt, który jest zwracany przez getClass()metodę dowolnego (bezpośredniego) wystąpienia Print.
getClass()jest użyteczne tylko wtedy, gdy masz odniesienie wskazujące na obiekt klasy. ClassName.classmożna użyć, nawet jeśli klasa nie ma instancji. Weźmy na przykład pod uwagę Math.class. Każdy jest odpowiedni w określonych sytuacjach.
Patricia Shanahan
Wspaniałe wyjaśnienie. Uwielbiam sposób, w jaki zidentyfikowałeś różnicę między .classa.getClass().
Sevastyan Savanyuk
6
Jeśli instancja obiektu jest dostępna, najprostszym sposobem uzyskania jej klasy jest wywołanie Object.getClass()
.classSkładnia
Jeśli typ jest dostępny, ale nie ma instancji, można uzyskać klasę, dołączając .classdo nazwy typu. Jest to również najłatwiejszy sposób na uzyskanie klasy dla typu pierwotnego.
boolean b;Class c = b.getClass();// compile-time errorClass c =boolean.class;// correct
Dla wyjaśnienia, ta metoda „.class” nie odnosi się do pliku kodu bajtowego, który widzisz po skompilowaniu kodu Java, ani nie jest pomyłką między koncepcjami klasy i obiektu w teorii OOP.
Ta metoda „.class” jest używana w Javie do odbicia kodu. Ogólnie możesz zebrać metadane dla swojej klasy, takie jak pełna kwalifikowana nazwa klasy, lista stałych, lista pól publicznych itp.
Zwykle nie planujesz używać Reflection od razu po rozpoczęciu tworzenia projektu. Jest to coś, czego potrzebujesz po próbie zarządzania już działającym kodem. Często jest to potrzebne do zarządzania wieloma instancjami programu. Może chcesz zidentyfikować każdy konkretny „klon”, aby określić, czy coś jest już zdefiniowane, policzyć liczbę funkcji lub po prostu zarejestrować szczegóły konkretnej instancji Twojej klasy.
Jeśli nie ma dostępnej instancji, .classdo pobrania odpowiedniego obiektu Class dla klasy używana jest składnia, w przeciwnym razie można użyć metody getClass (), aby pobrać obiekt Class. Ponieważ nie ma instancji pierwotnego typu danych, musimy użyć .classskładni dla pierwotnych typów danych.
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());}}
Myślę, że kluczem jest tutaj zrozumienie różnicy między klasą a obiektem. Obiekt jest instancją klasy. Ale w języku w pełni zorientowanym obiektowo klasa jest również obiektem . Zatem wywołanie .classpobiera odniesienie do obiektu Class tej klasy, którym można następnie manipulować.
in a fully object-oriented language, a Class is also an Object? <potrzebne źródło>
Sam Dufel
0
Literał klasy to wyrażenie składające się z nazwy klasy, interfejsu, tablicy lub typu pierwotnego lub pseudotypu void, po którym następuje znak „.” i klasa tokenów. Jedną ze zmian w JDK 5.0 jest to, że klasa java.lang.Class jest ogólna java.lang.Class Class<T>, dlatego:
.class
składnię, która jest tylko przypadkowo związana z.class
rozszerzeniem nazwy pliku.Odpowiedzi:
Kiedy piszesz
.class
po nazwie klasy, odwołuje się ona do literału klasy -java.lang.Class
obiektu, który reprezentuje informacje o danej klasie.Na przykład, jeśli twoja klasa to
Print
, toPrint.class
jest obiektem, który reprezentuje klasęPrint
w czasie wykonywania. Jest to ten sam obiekt, który jest zwracany przezgetClass()
metodę dowolnego (bezpośredniego) wystąpieniaPrint
.źródło
Writer.class.getDeclaredField("writeBuffer")
.Print.class
?new Intent(this, Activity.class
? Czy spróbuje się tego dowiedzieć,class Activity
porównując każdą klasę?.class
jest używany, gdy nie ma dostępnej instancji klasy..getClass()
jest używany, gdy istnieje dostępna instancja klasy.object.getClass()
zwraca klasę podanego obiektu.Na przykład:
Spowoduje to:
To jest klasa obiektu tekstowego :)
źródło
getClass()
jest użyteczne tylko wtedy, gdy masz odniesienie wskazujące na obiekt klasy.ClassName.class
można użyć, nawet jeśli klasa nie ma instancji. Weźmy na przykład pod uwagęMath.class
. Każdy jest odpowiedni w określonych sytuacjach..class
a.getClass().
Jeśli instancja obiektu jest dostępna, najprostszym sposobem uzyskania jej klasy jest wywołanie
Object.getClass()
.class
SkładniaJeśli typ jest dostępny, ale nie ma instancji, można uzyskać klasę, dołączając
.class
do nazwy typu. Jest to również najłatwiejszy sposób na uzyskanie klasy dla typu pierwotnego.Zobacz: docs.oracle.com o zajęciach
źródło
Dla wyjaśnienia, ta metoda „.class” nie odnosi się do pliku kodu bajtowego, który widzisz po skompilowaniu kodu Java, ani nie jest pomyłką między koncepcjami klasy i obiektu w teorii OOP.
Ta metoda „.class” jest używana w Javie do odbicia kodu. Ogólnie możesz zebrać metadane dla swojej klasy, takie jak pełna kwalifikowana nazwa klasy, lista stałych, lista pól publicznych itp.
Sprawdź te linki (już wspomniane powyżej), aby uzyskać wszystkie szczegóły:
https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
https://docs.oracle.com/javase/8/docs /api/java/lang/Class.html
Zwykle nie planujesz używać Reflection od razu po rozpoczęciu tworzenia projektu. Jest to coś, czego potrzebujesz po próbie zarządzania już działającym kodem. Często jest to potrzebne do zarządzania wieloma instancjami programu. Może chcesz zidentyfikować każdy konkretny „klon”, aby określić, czy coś jest już zdefiniowane, policzyć liczbę funkcji lub po prostu zarejestrować szczegóły konkretnej instancji Twojej klasy.
źródło
Jeśli nie ma dostępnej instancji,
.class
do pobrania odpowiedniego obiektu Class dla klasy używana jest składnia, w przeciwnym razie można użyć metody getClass (), aby pobrać obiekt Class. Ponieważ nie ma instancji pierwotnego typu danych, musimy użyć.class
składni dla pierwotnych typów danych.źródło
Myślę, że kluczem jest tutaj zrozumienie różnicy między klasą a obiektem. Obiekt jest instancją klasy. Ale w języku w pełni zorientowanym obiektowo klasa jest również obiektem . Zatem wywołanie
.class
pobiera odniesienie do obiektu Class tej klasy, którym można następnie manipulować.źródło
in a fully object-oriented language, a Class is also an Object
? <potrzebne źródło>Literał klasy to wyrażenie składające się z nazwy klasy, interfejsu, tablicy lub typu pierwotnego lub pseudotypu void, po którym następuje znak „.” i klasa tokenów. Jedną ze zmian w JDK 5.0 jest to, że klasa java.lang.Class jest ogólna
java.lang.Class Class<T>
, dlatego:Odniesienia tutaj:
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
źródło