2010-04-21 5 views
68

Sagen wir, ich habe eine Klasse:Wert public static über Reflexion in Java letzte Feld/Eigenschaft einer Klasse bekommen

public class R { 
    public static final int _1st = 0x334455; 
} 

Wie kann ich den Wert des Feldes/property „_1st“ durch Reflexion bekommen?

+0

'R._1.' konnte nicht funktionieren? Wenn du über Android-Entwicklung sprichst, denke ich, dass die 'R'-Klasse immer da ist ... – Matthieu

+0

@Matthieu dachte ich auch, bis zu diesem Tag, als ich genau dasselbe machen musste, aber nur mit dem' BR' Klasse. – Sevastyan

Antwort

94

Zuerst die Feldeigenschaft der Klasse abrufen, dann können Sie den Wert abrufen. Wenn Sie den Typ kennen, können Sie eine der Methoden get mit null verwenden (nur für statische Felder, bei einem statischen Feld wird das an die Methode get übergebene Argument vollständig ignoriert). Ansonsten können Sie getType verwenden und einen entsprechenden Schalter schreiben wie folgt:

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

danke. Ich habe es versucht, aber es hat nicht funktioniert. Bei der Operation f.getInt (null) wird eine Ausnahme ausgelöst. Ich habe es gefangen, aber wieso gibt es eine Ausnahme? – Viet

+1

Welche Art von Ausnahme haben Sie erhalten? –

+0

Hallo, die Ausnahme e.getMessage() gibt den Feldnamen zurück, der "_1st" ist und sonst nichts. – Viet

42
R.class.getField("_1st").get(null); 

Ausnahmebehandlung wird als Übung für den Leser überlassen.

Grundsätzlich erhalten Sie das Feld wie jedes andere über Reflexion, aber wenn Sie die Get-Methode aufrufen, übergeben Sie eine Null, da es keine Instanz gibt, auf die Sie reagieren können.

Dies funktioniert für alle statischen Felder, unabhängig davon, ob sie endgültig sind. Wenn das Feld nicht öffentlich ist, müssen Sie zuerst setAccessible(true) aufrufen, und natürlich muss der SecurityManager all dies zulassen.

+0

danke, aber es hat nicht geholfen ... – Viet

+2

@Viet, können Sie klären, was nicht funktioniert hat? Vielleicht posten Sie den Code, den Sie haben, der nicht funktioniert? – Yishai

+0

Hallo, die Ausnahme e.getMessage() gibt den Feldnamen zurück, der "_1st" ist und sonst nichts. – Viet

1

Ich wurde nach dem gleichen Weg (durch die erzeugten R-Klasse suchen), und dann hatte ich dieses schreckliche Gefühl es wahrscheinlich eine Funktion in der Ressourcen-Klasse war . Ich lag richtig.

diese Gefunden: Resources::getIdentifier

Dachte, es Leute etwas Zeit sparen könnten. Obwohl sie sagen, dass es in den Dokumenten entmutigt ist, was nicht allzu überraschend ist.

+0

Perfekt zum Lesen von Ressourcen von anderen APKs – schwiz

+0

Also Sie geschlussfolgert, es war eine Android-Frage. Sollte in den Tags angegeben werden ... – Matthieu

+0

Es ist keine Android-Frage, es ist eine Java-Reflektion Frage, die ein bestimmtes Beispiel verwendet. Fragen werden basierend auf ihrem Thema markiert. –

Verwandte Themen