我尝试更改单元测试的 private static final int 的int值。 我看了http://zarnekow.blogspot.de/2013/01/java-hacks-changing-final-fields.html 和http://java-performance.info/updating-final-and-static-final-fields/以及其他stackoverflow示例,例如:changing final variables through reflection, why difference between static and non-static final variable
30秒是默认计时器。我想用setOverReflectionMax_SECONDS(3)设置它;到3秒。 但它不起作用,任何提示?
我的基础类
public class BaseClass {
private static final int MAX_SECONDS = 30;
}
和其他班级
public final class MyClass extends BaseClass {
public static List<Field> getFields(final Class<?> clazz){
final List<Field> list = new ArrayList<>();
list.addAll(Arrays.asList(clazz.getDeclaredFields()));
if(clazz.getSuperclass() != null){
list.addAll(getFields(clazz.getSuperclass()));
}
return list;
}
public static void setOverReflectionMax_SECONDS(final int newValue) {
final List<Field> fields = getFields(MyClass.class);
for (final Field field : fields) {
if (field.getName().equals("MAX_SECONDS")) {
field.setAccessible(true); //EDIT 4
Field modifiersField;
try {
modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
} catch (final Exception e2) {
e2.printStackTrace();
}
}
}
}
}
Edit1:错误的类名
Edit2:我无法更改BaseClass(只获取.class文件)
Edit3:新例外
Class MyClass can not access a member of class BaseClass with modifiers "private static"
Edit4:查看代码,修复异常,但不会更改int
答案 0 :(得分:0)
即使使用反射也可能无法实现,因为编译器可能会内联该字段的值(我相信编译器可以自由选择是否执行此操作)。在这种情况下,值的副本在实际使用的位置进行硬编码,并且只能通过操作字节代码来更改。
在此问题中对此进行了更详细的解释:Change private static final field using Java reflection。
tl,dr:无法使用反射可靠地更改static final
字段。您的选择是: