use*_*903 18 java final modifier
听起来有点奇怪,但是可以final在运行时添加修改器吗?
我有一个标记为的变量public static int/short.在某些时候我想阻止改变它的值,我希望将其可访问性保持为标准静态值(ClassName.field).
public class Main {
private static int a = 0;
public static void addFinalMod(Field f) {
Field modifiersField = null;
try {
modifiersField = Field.class.getDeclaredField("modifiers");
}
catch (NoSuchFieldException e) {
e.printStackTrace();
}
modifiersField.setAccessible(true);
try {
modifiersField.setInt(f, f.getModifiers() & Modifier.FINAL);
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(a);
try {
Field f = Main.class.getDeclaredField("a");
addFinalMod(f);
}
catch (NoSuchFieldException e) {
e.printStackTrace();
}
a = 10; //I was expecting error/exception here
System.out.println(a);
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
10
Run Code Online (Sandbox Code Playgroud)
Sot*_*lis 33
在某些时候,我想防止改变它的价值
在应用程序逻辑中这样做.使变量只能通过方法访问.保持一个标志跟踪变量的任何变化.应用更改或达到某个点后,提高标志,并为更改变量的任何进一步尝试抛出异常.
final是一种语言关键字/功能,用于编写源代码并防止在源代码中重新分配变量.在运行时,它(几乎)没有.