0

我正在处理一个有许多设计问题的遗留 Java 项目。结果,代码的某些部分没有按预期运行。考虑以下代码:

public enum Parent{
    PARENT1(CHILD1, CHILD2), PARENT2(CHILD3, CHILD1), 
    PARENT3(CHILD4, CHILD2)

    private Child [] children;
    Parent(Child ...children) { this.children = children; } 

    public Child [] getChildren() { return this.children; }
}

public enum Child{ CHILD1, CHILD2, CHILD3, CHILD4  }

现在从上面的代码中,您可以清楚地看到 getChildren() 返回对数组的引用。因此,可以像这样更改数组的元素:

   Child [] childrenOfParent3 = Parent3.getChildren();
   childrenOfParent3[0] = null;  //badcode

一些代码正在做类似上面提到的事情,我很难找到这个(grep 没有帮助)。

有没有什么工具可以帮助我使用 jvm 字节码分析来定位这个模式(坏代码),或者你会怎么做?

注意:由于某些限制,我无法更改父实现。

谢谢!

4

3 回答 3

3

Findbugs能够检测到这一点

于 2011-10-21T20:21:25.803 回答
1

我们在这里谈论多少个实例?Eclipse 调试器等工具允许数据观察点(例如:对象已修改)。这将导致调试器在修改相关对象的确切代码行上立即停止。唯一的技巧是您需要在对象创建时放置一个断点,以便您可以识别要查看的对象。

于 2011-10-24T06:51:58.400 回答
0

您可以使用Java Decompiler将所有字节码转换为源代码,然后您应该能够想出一个正则表达式来匹配有问题的代码(或使用 FindBugs?)。

于 2011-10-21T21:18:17.870 回答