package test.logging.interceptor; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.apache.log4j.Logger; public class LoggingInterceptor implements MethodInterceptor { private Logger logger; public Object invoke(MethodInvocation invocation) throws Throwable { // クラス名とメソッド名を取得 String className = null; String methodName = null; // debugによるロギングが有効の場合のみ if (this.logger.isDebugEnabled()) { className = invocation.getThis().getClass().getName(); methodName = invocation.getMethod().getName(); StringBuffer paramBuf = new StringBuffer(); paramBuf.append(className).append("#").append(methodName).append(" params"); // 呼び出しパラメータと型 Object[] args = invocation.getArguments(); Class[] paramClasses = invocation.getMethod().getParameterTypes(); if (args == null || args.length == 0) { paramBuf.append("(<パラメータ無し>)"); } else { paramBuf.append("("); boolean isFirst = true; for (int i = 0; i < args.length; i++) { if (!isFirst) { paramBuf.append(", "); } Object o = args[i]; if (o == null) { paramBuf.append("null"); } else { paramBuf.append(paramClasses[i].getSimpleName()).append("[").append(o.toString()).append("]"); } isFirst = false; } paramBuf.append(")"); } this.logger.debug(paramBuf.toString()); } // 対象処理を実行 Object result = invocation.proceed(); // debugによるロギングが有効の場合のみ if (this.logger.isDebugEnabled()) { StringBuffer returnBuf = new StringBuffer(); returnBuf.append(className).append("#").append(methodName).append(" return"); // 戻り値と型 Class returnClass = invocation.getMethod().getReturnType(); if (returnClass == Void.TYPE) { returnBuf.append("(<戻り値無し>)"); } else { returnBuf.append("("); if (result == null) { returnBuf.append("null"); } else { returnBuf.append(returnClass.getSimpleName()).append("[").append(result.toString()).append("]"); } returnBuf.append(")"); } this.logger.debug(returnBuf.toString()); } return result; } public Logger getLogger() { return this.logger; } public void setLogger(Logger logger) { this.logger = logger; } }