获取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
实例根本不在调用堆栈上?
我正在尝试的是获取调用 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
实例根本不在调用堆栈上?