czym jest obiekt klasy (java.lang.Klasy)?
Dokumentacja Javy dla Class
says:
Class
obiekty są konstruowane automatycznie przez maszynę Wirtualną Java podczas ładowania klas oraz przez wywołania metodydefineClass
w loaderze klas.
Co to są Class
obiekty? Czy są one takie same jak obiekty utworzone z klasy przez wywołanie new
?
Również, na przykład object.getClass().getName()
Jak wszystko można wpisać do superclass Class
, nawet jeśli nie dziedziczę z java.lang.Class
?
5 answers
Nic nie zostaje wpisane do Class
. Każdy Object
w Javie należy do pewnego class
. Dlatego klasa Object
, która jest dziedziczona przez wszystkie inne klasy, definiuje metodę getClass()
.
getClass()
, lub class-literal - Foo.class
zwraca obiekt Class
, który zawiera pewne metadane dotyczące klasy:
- nazwa
- pakiet
- metody
- pola
- konstruktorzy
- Przypisy
I kilka przydatnych metod, takich jak odlewanie i różne kontrole (isAbstract()
, isPrimitive()
, itp.). javadoc pokazuje dokładnie, jakie informacje można uzyskać o klasie.
Więc, na przykład, jeśli twoja metoda otrzyma obiekt i chcesz go przetworzyć, jeśli jest opatrzona adnotacją @Processable
, to:
public void process(Object obj) {
if (obj.getClass().isAnnotationPresent(Processable.class)) {
// process somehow;
}
}
W tym przykładzie uzyskasz metadane dotyczące klasy danego obiektu (cokolwiek to jest) i sprawdzisz, czy posiada daną adnotację. Wiele metod na instancji Class
nazywa się " reflective operacje", lub po prostu " odbicie. przeczytaj tutaj o refleksji, dlaczego i kiedy jest używana.
Zauważ również, że liczby i interfejsy również reprezentują obiekt Class
i posiadają odpowiednie metadane.
Podsumowując-każdy obiekt w Javie ma (należy do) klasę i posiada odpowiedni obiekt Class
, który zawiera metadane o nim, które są dostępne w czasie wykonywania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-15 18:27:14
Obiekt klasy jest rodzajem meta obiektu opisującego klasę obiektu. Jest używany głównie z możliwościami odbicia Javy. Możesz myśleć o tym jak o "planie" prawdziwej klasy. Np. masz taki samochód klasowy:
public class Car {
public String brand;
}
Możesz następnie skonstruować obiekt klasy, który opisuje Twoją klasę "samochód".
Class myCarClass = Class.forName("Car");
Teraz możesz wykonywać różnego rodzaju zapytania na swojej klasie samochodu na tym obiekcie klasy:
myCarClass.getName() - returns "Car"
myCarClass.getDeclaredField("brand") - returns a Field object describing the "brand" field
I tak dalej. Każdy obiekt java posiada metodę getClass() który zwraca obiekt klasy opisujący klasę obiektu Java. Więc możesz zrobić coś w stylu:
Car myCar = new Car();
Class myCarClass = myCar.getClass();
Działa to również dla obiektów, których nie znasz, np. obiektów, które otrzymujesz z zewnątrz:
public void tellMeWhatThisObjectsClassIs(Object obj) {
System.out.println(obj.getClass().getName());
}
Możesz podać tę metodę dowolnemu obiektowi java i wyświetli on rzeczywistą klasę obiektu, który mu podałeś.
Podczas pracy z Javą, przez większość czasu nie musisz się martwić o Obiekty klas. Mają jednak kilka przydatnych przypadków użycia. Np. pozwalają na programowo instancjuje obiekty pewnej klasy, które są często używane do serializacji i deserializacji obiektów(np. konwertowanie obiektów Java do XML i z powrotem, głównie z powrotem).
Class myCarClass = Class.forName("Car");
Car myCar = myCarClass.newInstance(); // is roughly equivalent to = new Car();
Możesz go również użyć, aby znaleźć wszystkie zadeklarowane pola lub metody twojej klasy itp., co jest bardzo przydatne w niektórych przypadkach. Więc np. jeśli twoja metoda dostaje nieznany obiekt i musisz wiedzieć więcej na jego temat, np. jeśli jest to jakiś interfejs itp, klasa jest twoim przyjacielem proszę.
Tak w skrócie, Klasa, pole, metoda, itp. klasy, które są w Javie.lang.pakiet reflect pozwala analizować zdefiniowane klasy, metody, pola, tworzyć ich nowe instancje, wywoływać metody wszelkiego rodzaju innych rzeczy i pozwalają to robić dynamicznie w czasie wykonywania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-15 18:25:24
getClass()
jest metodą, która zwraca obiekt będący instancją java.lang.Class
... nie ma żadnego castingu. Casting wyglądałby tak:
Class<?> type = (Class<?>) object;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-15 18:16:49
Chciałbym również dodać do odpowiedzi Colinda, że getClass zwróci ten sam obiekt dla instancji tego samego typu. To wyświetli true :
MyOtherClass foo = new MyOtherClass();
MyOtherClass bar = new MyOtherClass();
System.out.println(foo.getClass()==bar.getClass());
Zauważ, że nie jest to równa się , używam ==.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-02 09:24:07
Obiekt klasy jest instancją klasy (java.lang.Klasy). Poniżej cytat zaczerpnięty z klasy javadoc powinien odpowiedzieć na twoje pytanie
Klasa nie ma konstruktora publicznego. Zamiast tego Obiekty klas są konstruowane automatycznie przez maszynę Wirtualną Java podczas ładowania klas i przez wywołania metody definiclass w loaderze klas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-19 19:03:19