【问题标题】:Can I change values of private fields during debug?我可以在调试期间更改私有字段的值吗?
【发布时间】:2011-03-21 09:47:33
【问题描述】:

出于调试目的,我需要更改私有字段的值。 我使用 Eclipse 进行调试,我可以在调试过程中更改变量,但我无法访问私有变量。我尝试在更改值视图中使用反射来手动将字段设置为“可访问”,但看起来它不起作用。 你知道任何 IDE/框架/插件或可以允许它的东西吗?

【问题讨论】:

  • 根据我的经验,只要调试器位于正确的堆栈框架中,我就设法更改了任何成员的值。你能提供更多关于你如何调试的细节吗?
  • 好吧,也许我对问题的描述不完整。例如,我有一个“数据”类的对象“数据”,其私有字段名为“mappy”。 “mappy”包含对象的映射。例如,我需要在其中插入一个附加值。在“更改值”窗口中,我可以在代码中创建新地图,用新值填充它,但我可以t get existing map or run any its 方法(放置或其他东西)。我找不到获取“data.mappy”对象的方法,尽管我可以使用“public”修饰符获取字段。
  • 我不明白您希望在程序在断点处停止时“运行”某些对象的方法。你认为谁会执行 put() 调用?您能做的最好的事情就是回溯一点,如果 IDE 允许,重新运行一些代码。
  • 为什么不能在运行代码中添加额外的某种 NOP 指令,这样程序就可以站在断点上,而 JVM 可以同时执行我的 put() 或其他东西?我在这里找不到任何技术问题。
  • 它不仅留有一些内存空间作为备用,供您添加/注入更多代码(在某些情况下这样做,例如用于分析的仪器)。你还想调用函数;这意味着会弄乱堆栈,因此一些额外的 NOOP 字节对您没有帮助。我建议退后一步,这样您就可以找到代码的真正问题所在。也许然后提出一个新问题,以便我们提供帮助?

标签: java debugging private field


【解决方案1】:

在 Eclipse 中,您可以转到列出所有变量的变量视图

这里你可以右键点击你想改变的成员变量,选择change value选项,会弹出一个单独的窗口来改变值。即日起生效。

【讨论】:

  • 对于原语,甚至不需要使用上下文菜单中的“更改值”。只需单击该值(以选择它),更改它,然后按 Enter。
【解决方案2】:

可以使用反射来设置字段值(Spring提供了方便的ReflectionTestUtil):

  Class<?> c = foo.getClass();
  Field field = c.getDeclaredField("valid");
  field.setAccessible(true);
  field.set(valid, Boolean.FALSE);

此外,在调试器中设置私有字段的值应该没有任何问题,它是否是私有的实际上并不重要。

【讨论】:

    【解决方案3】:

    刚刚用 eclipse 测试过 - 没问题。测试应用是这样的:

     public class DebugTest {
       private static int i = 5;
       public static void main(String[] args) {
         System.out.println(args.length);  // dummy line to set a breakpoint
         System.out.println(i);
       }
     }
    

    我在该虚拟行上设置了一个 BP,启动了调试器,然后我将变量视图中 i 的值从 5 更改为 6,继续,输出为 6。

    只有一件事:也许,您无法在“变量”视图中看到私有变量。打开视图菜单(带有三角形的按钮),选择 Java 并打开缺少的项目。静态常量默认是禁用的——也许这就是你的问题。

    【讨论】:

    • 好吧,也许我对问题的描述不完整。例如,我有一个“数据”类的对象“数据”,其私有字段名为“mappy”。 “mappy”包含对象的映射。例如,我需要在其中插入一个附加值。在“更改值”窗口中,我可以在代码中创建新地图,用新值填充它,但我可以t get existing map or run any its 方法(放置或其他东西)。我找不到获取“data.mappy”对象的方法,尽管我可以使用“public”修饰符获取字段。
    【解决方案4】:

    由于您将变量设为私有并且您希望在调试级别修改该值,因此任何 IDE/插件都不会发生这种情况。每个 IDE 都将遵循基本原则。

    【讨论】:

    • 私有访问与其他对象与该对象的关系有关。调试器不是系统中的对象。
    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多