Co to .classznaczy w Javie? Na przykład, jeśli utworzę klasę o nazwie Print. Co Print.classwraca?
.classskładnię, która jest tylko przypadkowo związana z .classrozszerzeniem nazwy pliku.
Co to .classznaczy w Javie? Na przykład, jeśli utworzę klasę o nazwie Print. Co Print.classwraca?
.classskładnię, która jest tylko przypadkowo związana z .classrozszerzeniem nazwy pliku.
Odpowiedzi:
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());
Writer.class.getDeclaredField("writeBuffer").
Print.class?
new Intent(this, Activity.class? Czy spróbuje się tego dowiedzieć, class Activityporó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.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.
.classa.getClass().
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
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, .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());
}
}
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>
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