2010-04-21 15 views
68

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?

+0

'R._1st' nie mógł działać? Jeśli mówimy o rozwoju Androida, myślę, że klasa "R" jest zawsze dostępna ... – Matthieu

+0

@Matthieu Też tak myślałem, aż do dzisiejszego dnia, kiedy musiałem zrobić to samo, ale tylko z 'BR' klasa. – Sevastyan

Odpowiedz

94

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)); 
}... 
+0

dzięki. Próbowałem, ale to nie zadziałało. Wyjątek jest zgłaszany podczas operacji f.getInt (null). Złapałem to, ale jak to jest wyjątek? – Viet

+1

Jakiego wyjątku otrzymałeś? –

+0

Witaj, wyjątek e.getMessage() zwraca nazwę pola, która jest "_1st" i nic więcej. – Viet

42
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.

+0

dzięki, ale to nie pomogło ... – Viet

+2

@Viet, możesz wyjaśnić, co nie działało? Być może po opublikowaniu kodu, który nie działa? – Yishai

+0

Witaj, wyjątek e.getMessage() zwraca nazwę pola, która jest "_1st" i nic więcej. – Viet

1

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.

+0

Idealny do czytania zasobów z innych apków. – schwiz

+0

Wywnioskowałeś, że to było pytanie na Androida. Powinny być wskazane w tagach ... – Matthieu

+0

To nie jest pytanie Android, to pytanie refleksyjne Java, które używa konkretnego przykładu. Pytania są oznaczone na podstawie ich tematu. –

Powiązane problemy