Co to .class
znaczy w Javie? Na przykład, jeśli utworzę klasę o nazwie Print
. Co Print.class
wraca?
.class
składnię, która jest tylko przypadkowo związana z .class
rozszerzeniem nazwy pliku.
Co to .class
znaczy w Javie? Na przykład, jeśli utworzę klasę o nazwie Print
. Co Print.class
wraca?
.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
, to Print.class
jest obiektem, który reprezentuje klasę Print
w 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());
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:
String string = "hello";
System.out.println(string.getClass().toString());
Spowoduje to:
class java.lang.String
To jest klasa obiektu tekstowego :)
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ładnia
Jeś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.
boolean b;
Class c = b.getClass(); // compile-time error
Class c = boolean.class; // correct
Zobacz: docs.oracle.com o zajęciach
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.
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.
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());
}
}
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ć.
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:
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