isDebugEnabledの中でdebugメソッドを呼んでいないコードを検出
つぎは、性能問題をチェックするためのHack。ここに書いてあるHackの変形版です。(直感的にはCategoryの所をLoggerにしたいのですが、Loggerにするとうまく動かないですね)
/** * @when * invocation.target = {@link Category#debug(Object)} * except { * enabled : {@link CtMethodInvocation} * enabled.target = {@link Category#isDebugEnabled()} * guard : {@link CtIf} * guard in enabled.ancestors * guard in invocation.ancestors * } */ public void found(CtMethodInvocation<?> invocation, Messager messager) { ... }
このHackを利用すると、以下のようなコードをチェックできます。
logger.debug("debug test"); // 問題として検出 if (logger.isDebugEnabled()) { // 問題なし logger.debug("debug test"); } if (logger.isDebugEnabled() == true) { // 問題なし logger.debug("debug test"); }
ただし、このHackだと、以下のようなものは検出できない。こんなことする人はいないだろうから、これは検出できなくても良いかな?
if (true) { // このQueryでは検出できない logger.isDebugEnabled(); logger.debug("debug test"); }