【发布时间】: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