Bawię się z interfejsem API odbicie Java i próbuję obsłużyć niektóre pola. Teraz utknąłem w identyfikacji typu moich pól. Ciągi są łatwe, po prostu zrób myField.getType().equals(String.class)
. To samo dotyczy innych klas niepochodzących. Ale jak mogę sprawdzić klasy pochodne? Np. LinkedList
Jako podklasa List
. Nie mogę znaleźć żadnej metody isSubclassOf(...)
ani extends(...)
metody. Czy muszę przejść wszystko getSuperClass()
i znaleźć własną klasę własną?
java
class
reflection
craesh
źródło
źródło
LinkedList
nie jest podklasąList
. Jest to realizacja odList
.Odpowiedzi:
Chcesz tę metodę:
gdzie ogólnie
List
(powyżej) należy zastąpićsuperclass
imyClass
należy je zastąpićsubclass
Z JavaDoc :
Odniesienie:
Class.isAssignableFrom(Class)
Związane z:
a) Sprawdź, czy obiekt jest instancją klasy lub interfejsu (w tym podklas), które znasz w czasie kompilacji:
Przykład:
b) Sprawdź, czy obiekt jest instancją klasy lub interfejsu (w tym podklas), które znasz tylko w czasie wykonywania:
Przykład:
źródło
SUPERCLASS.isAssignableFrom(SUBCLASS)
Najpierw mnie to pomyliło, chociaż w rzeczywistości jest to oczywiste, biorąc pod uwagę nazewnictwo.SUPERCLASS.isExtendedBy(SUBCLASS)
byłoby znacznie łatwiejsze do zrozumieniaisExtendedBy
jest złym imieniem, coCLASS.isAssignableFrom(CLASS)
byłoby prawdą (i dlategoCLASS.isExtendedBy(CLASS)
też). Nie tego się spodziewałem.Inną opcją jest instanceof:
źródło
Class.isInstance(object)
download.oracle.com/javase/6/docs/api/java/lang/…Field
. Ale chcę tylko „spojrzeć” na moją klasę i jej pola, nie chcę „wypróbowywać”.instanceof
działa również dlaNumber
samego rodzica (w tym przypadku ) nie tylko dla dzieciinstanceof działa na instancjach, tj. na Obiektach. Czasami chcesz pracować bezpośrednio z klasami. W takim przypadku możesz użyć metody asSubClass klasy Class. Kilka przykładów:
1)
przejdzie to płynnie, ponieważ JFrame jest podklasą Object. c będzie zawierać obiekt klasy reprezentujący klasę JFrame.
2)
spowoduje to uruchomienie java.lang.ClassCastException ponieważ JFrame NIE jest podklasą JButton. c nie zostanie zainicjowane.
3)
przejdzie to płynnie, ponieważ JFrame implementuje interfejs java.io.Serializable. c będzie zawierać obiekt klasy reprezentujący klasę JFrame.
Oczywiście należy uwzględnić potrzebny import.
źródło
To działa dla mnie:
źródło
To jest ulepszona wersja odpowiedzi @ schuttek. Jest poprawiony, ponieważ poprawnie zwraca false dla prymitywów (np. IsSubclassOf (int.class, Object.class) => false), a także poprawnie obsługuje interfejsy (np. IsSubclassOf (HashMap.class, Map.class) => true).
źródło
Metoda rekurencyjna sprawdzająca, czy a
Class<?>
jest podklasą innejClass<?>
...Ulepszona wersja @To kra „s odpowiedź :
źródło
//Dziedzictwo
// Metody
// Przetestuj kod
//Wynik
źródło