L'OP mentionne dans un commentaire que la solution préférée est d'utiliser des proxies java simples. Le code actuel est implémenté en tant que méthodes statiques - pour que les proxys java soient utiles, la classe logger devra être retravaillée en tant qu'interface. Quelque chose comme ceci:
public interface SomeActionLogger
{
void logSomeAction();
void logSomeOtherAction();
// etc..
}
Vous créez ensuite votre mise en œuvre concrète
public class SystemOutActionLogger implements SomeActionLogger
{
public void logSomeAction() {
System.out.println (msg(SOME_ACTION));
}
}
Vous pouvez alors proxies Java envelopper l'interface SomeActionLogger
class DelayAfterInvocationHandler implements InvocationHandler
{
private Object delegate;
private int duration;
DelayAfterInvocationHandler(Object delegate, int duration)
{
this.delegate = delegate;
this.duration = duration;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object returnValue = method.invoke(delegate, args);
Thread.sleep(duration);
// you may want to catch InterruptedEception
return returnValue;
}
}
Pour masquer une partie de la non-soi joli code proxy, vous pouvez alors avoir une méthode qui enveloppe votre enregistreur pour créer le retard, par exemple
public ActionLogger addDelay(SomeActionLogger logger, int delay)
{
return (ActionLogger)Proxy.newProxyInstance(
impl.getClass().getClassLoader(),
new Class[] { SomeActionLogger.class },
new DelayAfterInvocationHandler(logger, delay));
}
Vous écrivez alors
SomeActionLogger log = addDelay(new SystemOutActionLogger(), 2000);
Notez que le DelayInvocationHandler
est perpendiculaire à l'interface d'enregistrement - il peut être utilisé pour ajouter un délai à toute interface. Vous pourriez alors créer une méthode d'emballage générique comme ceci:
public <T> T addDelay(T delegate, int delay, Class<T> interfaceType)
{
return (T)Proxy.newProxyInstance(
delegate.getClass().getClassLoader(),
new Class[] { type },
new DelayAfterInvocationHandler(delegate, delay));
}
Tout comme je n'aime pas les aspects, c'est exactement ce qu'ils sont pour. Notez que vous devez utiliser un compilateur distinct, car les aspects ne font pas partie de l'implémentation Java standard; [AspectJ] (http://www.eclipse.org/aspectj/) est commun à Java –
J'aime l'idée des aspects, j'ai même appris quelque chose sur les aspects au printemps. Mais je n'ai pas encore assez de connaissances pour faire cette solution moi-même, mais je dois terminer la tâche. Avez-vous du code approprié ou au moins sscce? quelle dépendance devrait être résolue? – Roman
Les aspects ont l'inconvénient que le code que vous voyez dans votre éditeur n'est pas nécessairement le code en cours d'exécution. –