Powiedz, że mam zajęcia:
public class R {
public static final int _1st = 0x334455;
}
Jak mogę uzyskać wartość „_1st” poprzez odbicie?
Powiedz, że mam zajęcia:
public class R {
public static final int _1st = 0x334455;
}
Jak mogę uzyskać wartość „_1st” poprzez odbicie?
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:
Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
System.out.println(f.getInt(null));
}else if(t == double.class){
System.out.println(f.getDouble(null));
}...
getInt()
ignoruje przekazany argument? Spędził wiele godzin na próbach przeniesienia instancji klasy.
R.class.getField("_1st").get(null);
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.
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._1st
nie mógł działać? Jeśli mówisz o programowaniu na Androida, myślę, żeR
klasa jest zawsze tam ...