Powiedz, że mam zajęcia:
public class R {
public static final int _1st = 0x334455;
}
Jak mogę uzyskać wartość „_1st” poprzez odbicie?
java
reflection
static
final
Viet
źródło
źródło
R._1st
nie mógł działać? Jeśli mówisz o programowaniu na Androida, myślę, żeR
klasa jest zawsze tam ...BR
klasą.Odpowiedzi:
Najpierw pobierz właściwość pola klasy, a następnie możesz pobrać wartość. Jeśli znasz typ, możesz użyć jednej z metod get z wartością null (tylko w przypadku pól statycznych, w rzeczywistości w przypadku pól statycznych argument przekazany do metody get jest całkowicie ignorowany). W przeciwnym razie możesz użyć getType i napisać odpowiedni przełącznik jak poniżej:
źródło
getInt()
ignoruje przekazany argument? Spędził wiele godzin na próbach przeniesienia instancji klasy.Obsługa wyjątków pozostawia się czytelnikowi jako ćwiczenie.
Zasadniczo otrzymujesz pole jak każde inne przez odbicie, ale kiedy wywołujesz metodę get, przekazujesz wartość null, ponieważ nie ma instancji do działania.
Działa to dla wszystkich pól statycznych, niezależnie od tego, czy są ostateczne. Jeśli pole nie jest publiczne, musisz
setAccessible(true)
najpierw je wywołać i oczywiście SecurityManager musi zezwolić na to wszystko.źródło
Szedłem tą samą trasą (przeglądałem wygenerowaną klasę R) i wtedy miałem takie okropne wrażenie, że prawdopodobnie była to funkcja w klasie Resources. Miałem rację.
Znaleziono to: Resources :: getIdentifier
Pomyślałem, że to może zaoszczędzić ludziom trochę czasu. Chociaż mówią, że jest to zniechęcone w dokumentach, co nie jest zbyt zaskakujące.
źródło