【问题标题】:Java - identify code which changes a class private member?Java - 识别更改类私有成员的代码?
【发布时间】:2011-03-29 14:31:01
【问题描述】:

使用 Eclipse 或 IntelliJ 如何定位所有可能修改类的私有成员(类型为对象)的代码?

这个成员可以通过 getter 获得,所以理论上一个类可以调用 getMyMember() 然后将它设置为另一个值而不调用 setter。寻找所有可能的情况..

【问题讨论】:

  • “然后将其设置为另一个值”是什么意思? getMyMember() 返回的实例是否可变? 颤抖
  • 你能显示有问题的代码吗?只是私有字段声明和吸气剂。这个问题对我来说没有意义。
  • 是的,它是可变的..是的,不理想..
  • 如果您要返回一个对象,其他代码不能让您的私有字段引用另一个对象(在您的类中没有设置器或其他赋值)。它只能更改对象的属性。您是说对象的属性正在改变还是该字段被完全分配了一个新对象?

标签: java eclipse ide intellij-idea code-analysis


【解决方案1】:

此成员可通过 getter 获得,因此理论上一个类可以调用 getMyMember(),然后将其设置为另一个值,而无需调用 setter。

我不确定我是否理解正确,但你不能直接更改getMyMember() 返回的引用,只能更改被引用的对象。

【讨论】:

    【解决方案2】:

    重命名成员;所有访问现在都被标记为错误,让您可以轻松找到它们。

    【讨论】:

    • 问题是 getMyMember() 被调用了大约 50 次。其中许多调用将myMember 传递给另一个函数.. 很容易找到成员的用法,但找不到成员被修改的情况..
    • 好吧,没有人告诉你触摸getMyMember()。当然,getMyMember() 本身随后会被标记为错误,但对该方法的访问仍然有效且不会显示。
    【解决方案3】:

    在 Eclipse 中,右键单击私有成员并选择“打开调用层次结构”。

    请注意,私有成员是一个引用,不能在类之外修改——JNI 和反射等一些例外。

    你能从 getter 中返回一个包装对象吗?

    【讨论】:

      【解决方案4】:

      您必须从Java - identify code which changes a class private member? 开始,然后手动完成该列表。要使其自动化,您必须为这些访问生成一个特定的调用图。调用图并不难,但它们对于整个抽象语法树是通用的,不限于特定成员。

      创建目标成员类型的子类并覆盖适合记录访问/修改的任何方法以及堆栈跟踪,然后调用父方法可能会更快。 getter 可以创建新类,在构造函数中传入真实对象,并返回检测类。像注解或观察者之类的东西。

      【讨论】:

        【解决方案5】:

        在 Eclipse 中:选择变量或私有成员,右键单击,引用和工作区或在变量上使用快捷键ctrl+shift+g

        【讨论】:

        • 这只是获得一阶访问权限。当成员被传递给另一个方法(二阶访问)时,它可能会在那里被修改,这有点棘手。
        【解决方案6】:

        如上所述,这些问题存在部分缺陷:getObject() 访问器不允许类外的代码改变字段的状态。

        如果您也有 setObject() mutator,并且想知道新值将通过哪些代码路径“流入”该字段,请尝试 IntelliJ 中的“Analyze..Dataflow to this”。

        有关更多信息,请参阅此 IntelliJ 博客文章: http://blogs.jetbrains.com/idea/2009/08/analyzing-dataflow-with-intellij-idea/

        【讨论】:

          猜你喜欢
          • 2017-12-22
          • 1970-01-01
          • 2011-08-11
          • 1970-01-01
          • 2011-08-23
          • 2014-06-03
          • 2021-12-08
          • 1970-01-01
          • 2011-02-24
          相关资源
          最近更新 更多