获取Java中调用特定方法的对象的hashCode()

To get the hashCode() of the object that calls a specific method in Java

我正在尝试的是获取调用 Java 中特定方法的对象的 'hashCode()' 值。例如,

public class Caller {
    public void aMethod() {
        Callee calleeObj = new Callee();
        calleeObj.aSpecificMethod();
        //do something
    }
}

我想知道的是 Caller 的 hashCode() 值,它在运行时调用 calleeObj.aSpecificMethod()。它用于绘制如下所示的对象图。

作为限制,我只能使用字节码检测技术修改“.class”文件。

为此,我已尝试 Javassist 库在 Callee.aSpecificMethod() 内部进行检测,但这种方法无法获取调用者的对象。原因似乎很明显,因为“Callee.aSpecificMethod()”上的检测代码只能访问 Callee class 上的代码,而不能访问 Caller class.

上的代码

有什么方法可以使用 Javassist 捕获调用者对象的 hashCode() 值吗?我也在考虑 ASM 5.0,但使用 ASM 5.0 是最后的选择,因为到目前为止我已经基于 Javassist 构建了许多代码。

您必须将调用对象或其哈希码作为参数传递给该方法。

正如其他人所说,被调用的方法无法获取调用者对象,但到目前为止,没有人向您指出这永远不可能的原因:

关于您的请求的最大误解是您认为必须有一个“调用者对象”。但是没有这样的东西。您的方法可能会被 static 方法调用,例如直接来自应用程序的 main 方法,但也来自 class 初始化器或构造器,甚至在 super 构造器调用期间,换句话说,在对象存在于调用的上下文,但尚未完全构建,因此在无法调用 hashCode() 的地方。

如果您的想法中没有考虑到这些差距,您不应该开始使用 Instrumentation 来更改调用者的字节码。您不太可能生成正确的代码。即使在调用引用中存在实例的地方,该实例也不需要可用,哈希码计算也不需要。如果你的方法被另一个对象的 hashCode 方法调用怎么办?

除了实际障碍,最大的问题是,为什么你认为你需要“呼叫者”哈希码?你打算用它做什么,它不能是对的。想想下面的代码:

public class Caller {
    public void aMethod() {
        Callee calleeObj = new Callee();
        new Thread(calleeObj::aSpecificMethod).start();
    }
}

您对谁的哈希码感兴趣?在运行时生成的匿名实例class? Thread 实例调用那个匿名 class 的 run 方法?或者当你的方法被调用时,Caller 实例根本不在调用堆栈上?