OPはコメントで、好ましい解決策はプレーンなJavaプロキシを使用することであると述べています。現在のコードは静的メソッドとして実装されています。Java プロキシを使用するには、ロガー クラスをインターフェイスとして作り直す必要があります。このようなもの:
public interface SomeActionLogger
{
void logSomeAction();
void logSomeOtherAction();
// etc..
}
次に、具体的な実装を作成します
public class SystemOutActionLogger implements SomeActionLogger
{
public void logSomeAction () {
System.out.println (msg(SOME_ACTION));
}
}
SomeActionLogger
その後、Java プロキシにインターフェイスをラップさせることができます
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;
}
}
あまりきれいではないプロキシ コードの一部を非表示にするために、ロガーをラップして遅延を作成するメソッドを使用できます。
public ActionLogger addDelay(SomeActionLogger logger, int delay)
{
return (ActionLogger)Proxy.newProxyInstance(
impl.getClass().getClassLoader(),
new Class[] { SomeActionLogger.class },
new DelayAfterInvocationHandler(logger, delay));
}
だからあなたはそれから書く
SomeActionLogger log = addDelay(new SystemOutActionLogger(), 2000);
はロギング インターフェイスと直交していることに注意してくださいDelayInvocationHandler
。任意のインターフェイスに遅延を追加するために使用できます。次に、次のような一般的なラッピング メソッドを作成できます。
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));
}