有没有办法使用 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 代理中,还是在没有它的情况下。获取引用的唯一方法是检测方法的调用者以提供其自己的实例引用。

但从概念上讲,我不建议采用此解决方案,因为它很容易受到重构的影响,并且如果发生反射、方法句柄或来自静态方法的调用,也会产生未定义的行为。