【问题标题】:Set the value of a final field in debug mode in IntelliJ IDEA在 IntelliJ IDEA 的调试模式下设置 final 字段的值
【发布时间】:2020-05-05 23:16:01
【问题描述】:

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

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

【问题讨论】:

    标签: java debugging intellij-idea


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      IntelliJ IDEA(和 Java 调试器 API)doesn't support it。负责开发者的评论:

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

      ObjectReferenceImpl.java#L236:

              // Make sure the field is valid
              ((ReferenceTypeImpl)referenceType()).validateFieldSet(field);
      

      ReferenceTypeImpl.java#L614:

          void validateFieldSet(Field field) {
              validateFieldAccess(field);
              if (field.isFinal()) {
                  throw new IllegalArgumentException("Cannot set value of final field");
              }
          }
      

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

      【讨论】:

      • 问题是我无法获得变量的点,因为它是一个很长的表达式,而且我没有在 java 代码中创建所需的类。跨度>
      • 对不起,这是一个调试器 API 限制,没有办法做到这一点。你问了这个问题,得到的答案并不令人满意,但却是唯一有效的答案。所以feel free to accept it.
      猜你喜欢
      • 1970-01-01
      • 2020-02-24
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 2016-01-29
      • 2022-01-16
      • 2015-02-25
      相关资源
      最近更新 更多