您不能对接口执行此操作。但是,可以修改static final
类中的变量:
public abstract class I {
static final int val;
static
{
val = 1;
}
}
import java.lang.reflect.*;
public class NotFinal
{
public static void main(String args[]) throws Exception
{
System.out.println(I.val); // Before: 1
Field field = I.class.getDeclaredField("val");
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, 2);
System.out.println(I.val); // After: 2
}
}
输出:
1
2
请注意,如果您在声明中分配值,则这不起作用,即
static final int val = 1;
因为编译器对此的处理方式不同(作为常量) - 请参阅此答案。