有没有办法使用 ByteBuddy 在 Java 代理中检索调用者 "object"?
Is there a way to retrieve the caller "object" in a Java agent using ByteBuddy?
要检索调用者的class,我们可以使用StackWalker
:
@Advice.OnMethodEnter
static void enter(@Advice.This Object thiz,
@Advice.Origin Method method,
@Advice.AllArguments Object... args) {
var walker = StackWalker.getInstance(RETAIN_CLASS_REFERENCE);
var callerClass = walker.getCallerClass();
...
}
但是如果调用者对象还没有被垃圾回收,有没有办法获得对调用者对象的引用?
我尤其对调用者对象的 identity hash code 感兴趣。
不,这是不可能的,无论是在 Java 代理中,还是在没有它的情况下。获取引用的唯一方法是检测方法的调用者以提供其自己的实例引用。
但从概念上讲,我不建议采用此解决方案,因为它很容易受到重构的影响,并且如果发生反射、方法句柄或来自静态方法的调用,也会产生未定义的行为。
要检索调用者的class,我们可以使用StackWalker
:
@Advice.OnMethodEnter
static void enter(@Advice.This Object thiz,
@Advice.Origin Method method,
@Advice.AllArguments Object... args) {
var walker = StackWalker.getInstance(RETAIN_CLASS_REFERENCE);
var callerClass = walker.getCallerClass();
...
}
但是如果调用者对象还没有被垃圾回收,有没有办法获得对调用者对象的引用?
我尤其对调用者对象的 identity hash code 感兴趣。
不,这是不可能的,无论是在 Java 代理中,还是在没有它的情况下。获取引用的唯一方法是检测方法的调用者以提供其自己的实例引用。
但从概念上讲,我不建议采用此解决方案,因为它很容易受到重构的影响,并且如果发生反射、方法句柄或来自静态方法的调用,也会产生未定义的行为。