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 metody defineClass 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?

Author: dimo414, 2010-12-15

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.

 75
Author: Bozho,
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.

 36
Author: Jan Thomä,
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;
 7
Author: ColinD,
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 ==.

 4
Author: Koray Tugay,
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.

 2
Author: Pakka Techie,
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