【问题标题】:To get the hashCode() of the object that calls a specific method in Java获取调用Java中特定方法的对象的hashCode()
【发布时间】:2015-05-25 08:15:12
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 改变方法? calleeObj.aSpecificMethod(this.hashCode())
  • 你能改变调用者对象的类吗?如果是这样,只需按照@immibis 的建议添加一个参数即可。否则我认为这是不可能的。 (如果从静态上下文调用 hashCode 会发生什么?即,没有调用对象。)
  • 嗨,您可能想尝试使用 aop stuff (aspectj) 来实现这一目标?
  • @immibis 是的,但是使用 Javassist 修改每个方法的参数对我来说是不现实的。
  • @aioobe 我同意您的评论,即没有通过参数就没有选择。我考虑使用 ASM 或其他方式。

标签: java java-bytecode-asm javassist bytecode-manipulation


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 是的。在尝试了一些技巧之后,我也同意你的意见。这源于我对 Java 程序运行时结构的好奇,它与软件架构理论密切相关。但无论如何,在这一点上,我完全同意你的看法。谢谢你的解释。
【解决方案2】:

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

【讨论】:

  • 是的。我同意。似乎没有办法使用 Javassist。我应该考虑其他方式,包括 ASM。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2017-02-19
  • 2016-10-11
  • 1970-01-01
相关资源
最近更新 更多