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

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

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

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


person βξhrαng    schedule 02.06.2019    source источник


Ответы (1)


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

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

person Rafael Winterhalter    schedule 03.06.2019