Есть ли способ получить вызывающий объект "объект" в агенте Java с помощью ByteBuddy? - PullRequest
0 голосов
/ 02 июня 2019

Чтобы получить класс вызывающего, мы можем использовать 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();
    ...
}

но есть ли способ получить ссылку на объект вызывающего, если он еще не был собран сборщиком мусора?

В частности, меня интересует идентификационный хеш-код объекта вызывающей стороны.

1 Ответ

2 голосов
/ 03 июня 2019

Нет, это невозможно ни в агенте Java, ни без него.Единственный способ получить ссылку - это указать вызывающему методу метод для предоставления собственной ссылки на экземпляр.

Концептуально, однако, я бы не рекомендовал использовать это решение, поскольку оно очень уязвимо для рефакторинга итакже дает неопределенное поведение, если произойдет отражение, дескрипторы метода или вызовы статических методов.

...