Blz pessoal?
Decidi brincar um pouco com reflexão e uma API chamada CGLIB (Code Generation Library) e acabei criando um pacote que consegue pegar uma instância qualquer e a devolve encapsulada com características de log de método, bem prático.
Por exemplo (apenas ilustrativo):
Quero logar tudo o que acontece com uma instância da ArrayList (que podemos supor que não temos acesso a seu código fonte), para logá-la, basta “envolvermos” a instância verdadeira de ArrayList em um LogWrapper.enableTrace e pronto! Saberemos tudo o q se passa internamente com a instância de ArrayList.
List<String> myList = LogWrapper.enableTrace(new ArrayList<String>(), log, Level.INFO);
myList.add("It's a test");
myList.add("and another test");
O código acima gerará a seguinte saída:
[Thread[main,5,main]] java.util.ArrayList.add("It's a test") # add method call (with argument)
[Thread[main,5,main]] java.util.ArrayList.ensureCapacity(1) # ensureCapacity call (called internally by add)
[Thread[main,5,main]] return: [null] # return of ensureCapacity (void)
[Thread[main,5,main]] return: [true] # return of add (true)
[Thread[main,5,main]] java.util.ArrayList.add("and another test") # the same process again...
[Thread[main,5,main]] java.util.ArrayList.ensureCapacity(2)
[Thread[main,5,main]] return: [null]
[Thread[main,5,main]] return: [true]
Caso tenham interesse, há mais detalhes no meu blog e o pacote pode ser baixado no GitHub.