【发布时间】:2014-04-24 15:56:14
【问题描述】:
我有一种情况,我必须更改 java 常量。
我有下面的代码工作
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);
}
}
如果我在上面运行,我会得到以下输出:
Everything is 44
Everything is 33
但是如果我将 FLAG 变量更改为 int 即
public static final int FLAG = 44;
它不起作用。输出是:
Everything is 44
Everything is 44
有没有其他方法可以使它与Primitive 一起工作,输入int。
【问题讨论】:
-
变量要改为什么要声明final?删除final。
-
+1 对上述评论。简单的答案是 int 是不可变的,但我对 java 的了解不够深,无法自信地回答
-
编译时常量是内联的。如果直到运行时才知道该值,则可以对其进行更改。注意:更改
final变量肯定会引起混淆,因此您实际上不会在生产环境中这样做。 -
应该不需要涉及
modifiers的三行。 -
@mvmn 我无法删除它。我正在使用一个需要传递整数的库,但它只接受常量。这个值应该来自属性文件。
标签: java class reflection primitive