Say mam klasy:Pierwsze wartość publicznego statycznego pola końcowego/właściwość klasy w Javie poprzez odbicie
public class R {
public static final int _1st = 0x334455;
}
Jak mogę uzyskać wartość pola/nieruchomość „_1st” poprzez odbicie?
Say mam klasy:Pierwsze wartość publicznego statycznego pola końcowego/właściwość klasy w Javie poprzez odbicie
public class R {
public static final int _1st = 0x334455;
}
Jak mogę uzyskać wartość pola/nieruchomość „_1st” poprzez odbicie?
Najpierw pobierz właściwość pola klasy, a następnie pobierz wartość. Jeśli znasz typ, możesz użyć jednej z metod get z wartością zerową (tylko dla pól statycznych, w rzeczywistości w przypadku pola statycznego argument przekazany do metody get jest całkowicie ignorowany). W przeciwnym wypadku można 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));
}...
R.class.getField("_1st").get(null);
Obsługa wyjątków pozostaje ćwiczeniem dla czytelnika.
Zasadniczo otrzymujesz pole jak każde inne za pomocą odbicia, ale kiedy wywołujesz metodę get, przekazujesz wartość zerową, ponieważ nie ma żadnej 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 najpierw zadzwonić pod numer setAccessible(true)
i oczywiście menedżer zabezpieczeń musi zezwolić na to wszystko.
byłem po tej samej trasie (patrząc przez generowanej klasy R) i wtedy miałem to okropne uczucie, to chyba funkcja w klasie Resources . Miałem rację.
Znalazłem to: Resources::getIdentifier
że może uratować ludziom trochę czasu. Chociaż mówią, że jest zniechęcony w dokumentach, co nie jest zbyt zaskakujące.
'R._1st' nie mógł działać? Jeśli mówimy o rozwoju Androida, myślę, że klasa "R" jest zawsze dostępna ... – Matthieu
@Matthieu Też tak myślałem, aż do dzisiejszego dnia, kiedy musiałem zrobić to samo, ale tylko z 'BR' klasa. – Sevastyan