Как можно найти список методов, которые были вызваны для Java объекта?

Существуют ли в Java какие-либо библиотеки, которые позволяют получить последовательность методов, примененных к объекту, начиная с его конструирования?
  • 31 января 2024 г. 12:38
Ответы на вопрос 2
Напрямую в стандартной библиотеке Java нет средств, позволяющих получить историю вызовов методов объекта после их выполнения. Для такой задачи обычно используют отладчики, профайлеры или специальные библиотеки для анализа поведения кода в рантайме.

Однако, можно использовать несколько подходов для получения подобной информации во время выполнения:

1. **Логирование**. Вы можете добавлять записи в журнал логов при каждом вызове метода. Это можно сделать вручную или с помощью аспектно-ориентированного программирования (AOP), например, с использованием библиотеки AspectJ.

2. **AOP (Aspect-Oriented Programming)**. Аспекты могут быть использованы для автоматического добавления логирования или иных действий при вызове методов. AspectJ и Spring AOP являются популярными инструментами для реализации аспектно-ориентированного подхода в Java.

3. **Профайлинг и инструментирование**. Использование профайлеров, таких как VisualVM, YourKit, JProfiler или других инструментов, позволяет вам отслеживать вызовы методов и производительность в реальном времени. 

4. **Средства отладки JVM**. Вы можете использовать API отладчика JVM, чтобы создать собственный инструмент или скрипт для мониторинга вызовов методов.

5. **Java Agent и библиотеки инструментирования**. Вы можете использовать Java Instrumentation API с Java Agent для изменения классов на лету и записи информации о вызовах методов. Библиотеки, такие как Byte Buddy, ASM или Javassist, облегчают работу с байт-кодом Java.

Ниже пример использования AOP с AspectJ для логирования вызовов методов:

```java
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.JoinPoint;

@Aspect
public class MethodCallLogger {

    @Pointcut("execution(* com.yourpackage..*.*(..))") // точка среза, где com.yourpackage - это ваш пакет
    public void methodCall() {}

    @Before("methodCall()")
    public void beforeMethodCall(JoinPoint joinPoint) {
        System.out.println("Called: " + joinPoint.getSignature().toShortString());
    }
}
```

Применение AOP облегчит эту задачу и позволит вам интерцептировать вызовы методов без изменения существующего кода объекта.

В любом случае, подобные механизмы обычно ориентированы на использование во время разработки или тестирования, а не в продуктивной среде, поскольку они вносят дополнительные накладные расходы на производительность системы.
Если я правильно понимаю, то вас нужен трейсинг 
https://github.com/btraceio/btrace
Вот, тут еще есть интересная статья - https://copyprogramming.com/howto/how-to-log-trace...

Вот, еще по теме - https://stackoverflow.com/questions/1069066/how-ca...

Вот, средствами самой java - https://www.baeldung.com/java-get-current-stack-trace
Похожие вопросы