如何识别返回的对象是否是在方法执行期间创建的-Java

如何识别返回的对象是否是在方法执行期间创建的-Java,java,methods,return-value,static-analysis,Java,Methods,Return Value,Static Analysis,原始问题:给定一个方法,我想确定返回的对象是否是在该方法的执行过程中创建的。我可以或应该使用哪种静态分析 返工问题:给定一个方法,我想确定在该方法中创建的对象是否可以由该方法返回。所以,如果我遍历并将该方法中返回类型的所有实例化添加到一个集合中,是否有一个分析会告诉我,对于集合的每个成员,它是否可以返回。此外,是否可以不将集合限制为单个方法,而是将原始方法调用的所有方法都限制为委派 这不是特定于任何调用的 看来方法逃逸分析可能是答案 谢谢大家的建议 我不确定这是否适用于您的环境,但一种简单的方法

原始问题:给定一个方法,我想确定返回的对象是否是在该方法的执行过程中创建的。我可以或应该使用哪种静态分析

返工问题:给定一个方法,我想确定在该方法中创建的对象是否可以由该方法返回。所以,如果我遍历并将该方法中返回类型的所有实例化添加到一个集合中,是否有一个分析会告诉我,对于集合的每个成员,它是否可以返回。此外,是否可以不将集合限制为单个方法,而是将原始方法调用的所有方法都限制为委派

这不是特定于任何调用的

看来方法逃逸分析可能是答案


谢谢大家的建议

我不确定这是否适用于您的环境,但一种简单的方法是在对象的构造函数中填充新添加的“InstancedTime”字段,并将其与调用方法的时间进行比较。这假设您有权访问相关对象的源。

我不确定这是否适用于您的情况,但一种简单的方法是在对象的构造函数中填充新添加的“InstancedTime”字段,并将其与调用方法的时间相比较。这假设您有权访问相关对象的源。

您确定静态分析是该作业的正确工具吗?静态分析可以在某些情况下给出结果,但不是全部

在调试器下运行JVM时,它会为对象分配越来越多的对象ID,您可以通过
System.identityHashCode(object o)获取这些ID。
您可以使用此事实构建一个创建对象(检查点)的测试用例,然后调用该方法。如果返回的对象的id大于检查点id,则您知道该对象是在方法中创建的


免责声明:这是在Windows XP调试器下观察到的行为。

您确定静态分析是该作业的正确工具吗?静态分析可以在某些情况下给出结果,但不是全部

在调试器下运行JVM时,它会为对象分配越来越多的对象ID,您可以通过
System.identityHashCode(object o)获取这些ID。
您可以使用此事实构建一个创建对象(检查点)的测试用例,然后调用该方法。如果返回的对象的id大于检查点id,则您知道该对象是在方法中创建的


免责声明:这是在Windows XP下的调试器下观察到的行为。

我感觉如果没有经过特别修改的JVM,这是不可能做到的。这里有一些方法。。。以及为什么它们一般不起作用

静态分析方法适用于简单情况。然而,像这样的东西可能会阻碍任何当前一代静态分析工具:

// Bad design alert ... don't try this at home!
public class LazySingletonStringFactory {
    private String s;
    public String create(String initial) {
        if (s == null) {
            s = new String(initial);
        }
        return s;
    }
}
静态分析器若要确定对
LazySingletonStringFactory.create(…)
的给定调用是否返回新创建的
字符串
,必须确定以前未调用过该字符串。停顿问题告诉我们,在某些情况下,这在理论上是不可能的,而在实践中,这超出了“最新技术”

IdentityHashCode方法可以在单线程应用程序中工作,该应用程序在没有运行垃圾收集器的情况下完成。但是,如果GC运行,您将得到错误的答案。如果您有多个线程,那么(取决于JVM),您可能会发现对象被分配在不同的“空间”中,从而导致对象“id”创建序列在所有线程中不再是单调的

如果您可以直接修改源代码更改、基于注释的代码注入或通过某种字节码处理来修改所关心的类的代码,那么代码插装方法就可以工作。但是,一般来说,不能对所有类都执行这些操作


(我不知道有任何其他方法与上述三种方法有实质性的不同……但请随意提出建议作为评论。)

我觉得如果没有经过特别修改的JVM,这是不可能做到的。这里有一些方法。。。以及为什么它们一般不起作用

静态分析方法适用于简单情况。然而,像这样的东西可能会阻碍任何当前一代静态分析工具:

// Bad design alert ... don't try this at home!
public class LazySingletonStringFactory {
    private String s;
    public String create(String initial) {
        if (s == null) {
            s = new String(initial);
        }
        return s;
    }
}
静态分析器若要确定对
LazySingletonStringFactory.create(…)
的给定调用是否返回新创建的
字符串
,必须确定以前未调用过该字符串。停顿问题告诉我们,在某些情况下,这在理论上是不可能的,而在实践中,这超出了“最新技术”

IdentityHashCode方法可以在单线程应用程序中工作,该应用程序在没有运行垃圾收集器的情况下完成。但是,如果GC运行,您将得到错误的答案。如果您有多个线程,那么(取决于JVM),您可能会发现对象被分配在不同的“空间”中,从而导致对象“id”创建序列在所有线程中不再是单调的

如果您可以直接修改源代码更改、基于注释的代码注入或通过某种字节码处理来修改所关心的类的代码,那么代码插装方法就可以工作。但是,一般来说,不能对所有类都执行这些操作


(我不知道有任何其他方法与上述三种方法有实质性的不同……但请随意提出建议作为评论。)

不确定是否有可靠的静态方法

您可以使用:

  • 或者可以使用类似的AOP库来安装