Ich habe eine Situation, in der ich Java-Konstante ändern muss.Ändern der statischen Variable funktioniert primitive Wrapper, aber nicht mit primitiven Typ
ich unten Code haben Arbeits
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Main {
public static final Integer FLAG = 44;
static void setFinalStatic(Class<?> clazz, String fieldName, Object newValue) throws NoSuchFieldException, IllegalAccessException {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
Field modifiers = field.getClass().getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
public static void main(String... args) throws Exception {
System.out.printf("Everything is %s%n", FLAG);
setFinalStatic(Main.class, "FLAG", 33);
System.out.printf("Everything is %s%n", FLAG);
}
}
Wenn ich oben laufen, ich folgende Ausgabe:
Everything is 44
Everything is 33
Aber wenn ich FLAG
Variable ändern dh
public static final int FLAG = 44;
int Es funktioniert nicht. Die Ausgabe lautet:
Everything is 44
Everything is 44
Gibt es eine andere Art und Weise es int
mit Primitive
Art zu arbeiten.
Warum deklarieren Sie die Variable endgültig, wenn Sie sie ändern möchten? Entfernen Sie das Finale. – mvmn
+1 zu dem obigen Kommentar. Die einfache Antwort ist, dass Ints nicht veränderbar sind, aber ich weiß nicht genug Deep Java, um mit Zuversicht zu antworten –
Kompilierzeitkonstanten sind inline. Wenn der Wert bis zur Laufzeit nicht bekannt ist, kann er geändert werden. Hinweis: Wenn Sie 'final'-Variablen ändern, führt dies zu Verwirrung, so dass Sie dies in der Produktion nicht tun würden. –