更新unittest的基类中的private static final int

时间:2014-11-19 13:51:51

标签: java unit-testing reflection

我尝试更改单元测试的 private static final int 的int值。 我看了http://zarnekow.blogspot.de/2013/01/java-hacks-changing-final-fields.htmlhttp://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

1 个答案:

答案 0 :(得分:0)

即使使用反射也可能无法实现,因为编译器可能会内联该字段的值(我相信编译器可以自由选择是否执行此操作)。在这种情况下,值的副本在实际使用的位置进行硬编码,并且只能通过操作字节代码来更改。

在此问题中对此进行了更详细的解释:Change private static final field using Java reflection

tl,dr:无法使用反射可靠地更改static final字段。您的选择是:

  • 操纵字节代码(一个相当绝望的选项)
  • 找到另一个解决方案(子类,包装器,代理......)
  • (作者的错误)更改源代码,使值可设置/可配置