Angenommen, ich habe eine Klasse:
public class R {
public static final int _1st = 0x334455;
}
Wie kann ich den Wert des "_1st" durch Reflexion erhalten?
BR
Klasse.
Angenommen, ich habe eine Klasse:
public class R {
public static final int _1st = 0x334455;
}
Wie kann ich den Wert des "_1st" durch Reflexion erhalten?
BR
Klasse.
Antworten:
Rufen Sie zuerst die Feldeigenschaft der Klasse ab, dann können Sie den Wert abrufen. Wenn Sie den Typ kennen, können Sie eine der get-Methoden mit null verwenden (nur für statische Felder, bei einem statischen Feld wird das an die get-Methode übergebene Argument vollständig ignoriert). Andernfalls können Sie getType verwenden und einen geeigneten Schalter wie folgt schreiben:
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()
das übergebene Argument ignoriert wird? Verbrachte Stunden damit, die Instanz der Klasse dorthin zu bringen.
R.class.getField("_1st").get(null);
Die Ausnahmebehandlung bleibt dem Leser als Übung überlassen.
Grundsätzlich erhalten Sie das Feld wie jedes andere über Reflektion, 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 setAccessible(true)
es zuerst aufrufen , und natürlich muss der SecurityManager all dies zulassen.
Ich folgte der gleichen Route (sah durch die generierte R-Klasse) und hatte dann das schreckliche Gefühl, dass es wahrscheinlich eine Funktion in der Resources-Klasse war. Ich lag richtig.
Gefunden dies: Resources :: getIdentifier
Ich dachte, es könnte den Leuten Zeit sparen. Obwohl sie sagen, dass es in den Dokumenten entmutigt ist, ist das nicht allzu überraschend.
R._1st
konnte nicht arbeiten? Wenn Sie über Android-Entwicklung sprechen, denke ich, dass dieR
Klasse immer da ist ...