Q4:コンストラクタの呼び出しをログに記録するには?

以下のようなアスペクトを作成します。

package logtest.aop.aspect;

import org.apache.log4j.*;

aspect ConstructorTrace {
        
        private static final Logger logger = 
        Logger.getLogger("logtest.aop.aspect.ConstructorTrace");
        pointcut initialize(): execution(public *.new(..));

        before(): initialize() {
                logger.debug("entering:" + thisJoinPoint);
        }
        after() returning: initialize() {
                logger.debug("exiting:" + thisJoinPoint);
        }
}

このアスペクトを Q3 の Test1 クラスへ織り込み実行すると、以下のログが出力されます。

DEBUG - entering:execution(void logtest.aop.Main.main(String[]))
DEBUG - entering:execution(logtest.aop.Test1())
DEBUG - entering:execution(logtest.aop.Custom())
DEBUG - exiting:execution(logtest.aop.Custom())
DEBUG - entering:execution(void logtest.aop.Test1.test1(String))
DEBUG - exiting:execution(void logtest.aop.Test1.test1(String))
DEBUG - entering:execution(void logtest.aop.Test1.test2(int))
DEBUG - exiting:execution(void logtest.aop.Test1.test2(int))
DEBUG - entering:execution(void logtest.aop.Test1.test3(int, int))
DEBUG - exiting:execution(void logtest.aop.Test1.test3(int, int))
DEBUG - entering:execution(void logtest.aop.Test1.test4(int[]))
DEBUG - exiting:execution(void logtest.aop.Test1.test4(int[]))
DEBUG - entering:execution(void logtest.aop.Test1.test5(Custom))
DEBUG - exiting:execution(void logtest.aop.Test1.test5(Custom))
DEBUG - entering:execution(int logtest.aop.Test1.test6())
DEBUG - exiting:execution(int logtest.aop.Test1.test6())
DEBUG - entering:execution(String logtest.aop.Test1.test7())
DEBUG - exiting:execution(String logtest.aop.Test1.test7())
DEBUG - entering:execution(String[] logtest.aop.Test1.test8())
DEBUG - exiting:execution(String[] logtest.aop.Test1.test8())
DEBUG - entering:execution(String logtest.aop.Test1.test9())
DEBUG - exiting:execution(String logtest.aop.Test1.test9())
DEBUG - exiting:execution(logtest.aop.Test1())
DEBUG - exiting:execution(void logtest.aop.Main.main(String[]))

コンストラクタに対する join point としては、execution ではなく call を使用する方法が正しいようですが、call を使用すると余計なログが出力されたりエラーが発生したため、上では execution を使用しました。正しい使い方ではない(と思われる)ため、詳細はドキュメントを参照して下さい。


トップページへ戻る