Java, como rastrear funções chamadas

Quero rastrear o início [e o término] das funções chamadas em Java, como o seguinte código:

    public void foo() {
  System.out.println("begin of foo()");
  ...
  System.out.println("e-n-d of foo()");
 }

Mas manutenção do código de despejoSystem.out.println é algo tedioso e propenso a erros, pois pode haver dezenas de sons de função em uma classe.

Alguma boa ideia pode facilitar esse trabalho? Não quero instruções de despejo em todo o arquivo.

A implementação de ambos ou de um dos traços inicial e final é preferível.
Mas, se impossível, as gravações das quais a função foi chamada também são úteis. Quero dizer, não me importo com o início e o término exatos, apenas diga que a função foi chamada.

questionAnswers(4)

yourAnswerToTheQuestion