Proxy Dinamico per logging

Può essere necessario loggare tutto ciò che fa una determinata classe che però fa parte di una libreria e non contiene tutti i log desiderati. Supponendo che non sia necessario debuggare la classe in sè, che fa quello che deve fare nel modo giusto, ma come viene utilizzata all’interno del progetto ho trovato che realizzare un proxy dinamico sia una soluzione efficace e molto versatile. Anche perchè fatto uno, va bene per qualsiasi classe.

La classe che andiamo da realizzare fa due cose :

  • implementa InvocationHandler in modo che venga richiamata tutte le volte che viene chiamato un metodo dall’utilizzatore del target da loggare
  • ha un factory method di comodo che crea una nuova istanza di proxy dinamico attaccando se stessa come InvocationHandler

Implementare InvocationHandler significa implementare il metodo invoke:

invoke di fatto richiama il metodo del target e logga nome del metodo, parametri e risultati. Più la gestione delle eccezioni del metodo target e di tutte le altre possibili eccezioni.

Il metodo wrap permette di avere la nostra classe ben wrappata con un solo comando.

Visto che tutto questo mi ha permesso oggi di scoprire un utilizzo un pò insensato dell’accesso ai dati con conseguente lentezza ho pensato di condividerlo.