Java 在IntelliJ IDEA的调试模式下设置最终字段的值

Java 在IntelliJ IDEA的调试模式下设置最终字段的值,java,debugging,intellij-idea,Java,Debugging,Intellij Idea,我正在用IntelliJ IDEA调试一个方法,在调试模式下,我需要设置final字段的值。有可能以某种方式实现吗 这是我的IDE在调试模式下的映像,我正在尝试更改collectionId变量的值 IntelliJ IDEA(和Java调试器API)。负责开发人员的意见: Java JDI代码中有一个check(com.sun.tools.JDI.ObjectReferenceImpl#setValue)不允许更改最终字段的值,它是很久以前添加的 : : 不允许这样做的原因是更改final字段可

我正在用IntelliJ IDEA调试一个方法,在调试模式下,我需要设置final字段的值。有可能以某种方式实现吗

这是我的IDE在调试模式下的映像,我正在尝试更改
collectionId
变量的值

IntelliJ IDEA(和Java调试器API)。负责开发人员的意见:

Java JDI代码中有一个check(
com.sun.tools.JDI.ObjectReferenceImpl#setValue
)不允许更改最终字段的值,它是很久以前添加的

:

:


不允许这样做的原因是更改final字段可能会导致行为不一致:某些值可能已经被编译器“内联”,并且不会更改。

好吧,这是可行的。在“评估/修改Intellij”对话框中调整并键入以下内容:

Field finalF = this.getClass().getDeclaredField( "m_field" );
finalF.setAccessible(true);
finalF.setInt(this, newValue);

问题是我无法获取变量的点,因为它是一个非常长的表达式,并且我没有在java代码中创建所需的类。很抱歉,这是调试器API的限制,没有办法做到这一点。你问了这个问题,得到的答案并不令人满意,但却是唯一有效的答案。所以
    void validateFieldSet(Field field) {
        validateFieldAccess(field);
        if (field.isFinal()) {
            throw new IllegalArgumentException("Cannot set value of final field");
        }
    }
Field finalF = this.getClass().getDeclaredField( "m_field" );
finalF.setAccessible(true);
finalF.setInt(this, newValue);