Co oznacza .class w Javie?

149

Co to .classznaczy w Javie? Na przykład, jeśli utworzę klasę o nazwie Print. Co Print.classwraca?

Quinn Wei
źródło
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.

Print myPrint = new Print();
System.out.println(Print.class.getName());
System.out.println(myPrint.getClass().getName());
Javier
źródło
2
Jakie są rzeczy, które można zrobić z obiektem klasy?
Kevin
7
@Kevin Zobacz dokumentację API dla java.lang.Class .
Patricia Shanahan
Zastosowanie: dostęp do pól prywatnych, na przykład: Writer.class.getDeclaredField("writeBuffer").
jordanpg
2
Więc jaki jest tego typ Print.class?
Zhipeng YANG,
1
A jak radzi sobie Android new Intent(this, Activity.class? Czy spróbuje się tego dowiedzieć, class Activityporównując każdą klasę?
Zhipeng YANG,
56

.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:

String string = "hello";
System.out.println(string.getClass().toString());

Spowoduje to:

class java.lang.String

To jest klasa obiektu tekstowego :)

Krzysztof
źródło
7
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 error

Class c = boolean.class;  // correct

Zobacz: docs.oracle.com o zajęciach

Andrzej
źródło
6

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.

Salvador Valencia
źródło
3

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;

    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());
       }
    }
Ranjeet
źródło
1

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ć.

Kserkses
źródło
4
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<Print> p = Print.class;

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

PbxMan
źródło