如何在Java源代码中注释掉对特定API的调用

时间:2009-04-20 23:50:50

标签: java parsing

我想在我的代码库中注释掉所有对API的调用(在我的例子中是java.util.Logging)。有一个很好的图书馆可以轻松完成吗? 我尝试过Eclipse ASTParser,但这与Eclipse有关。我现在正在努力研究PMD的解析器。我还没有看过它,但Jackpot可以这样做吗?还有其他建议吗?

6 个答案:

答案 0 :(得分:4)

我知道这不是您要求的,但我只想提醒您注意您可以在配置文件中更改日志OFF

答案 1 :(得分:2)

如果你想对此发表评论:

Log.doLog("Here is a" /* With a block comment to make it hard */
    + " multiline log statement"
    ); doSomethingEssential();

然后你会有一个比较棘手的时间,因为你需要在某种程度上解析代码以了解评论的位置。即你希望能够做到这一点:

// Log.doLog("Here is a" /* With a block comment to make it hard */
//     + " multiline log statement"
//     ); // Line break inserted here
doSomethingEssential();

这样做要轻松得多:

if (false) Log.doLog("Here is a" /* With a block comment to make it hard */
    + " multiline log statement"
    );

'if false'部分最终被编译器优化,而Log语句不会进入最终的.class文件。

这样你需要的只是构建脚本中的搜索/替换步骤,它取代了所有出现的

"Log.doLog("

使用

"if (false) Log.doLog(" or
"if (true) Log.doLog("

不依赖于棘手的代码解析。

答案 2 :(得分:0)

sed?只需用注释行替换即可。您需要考虑匹配正则表达式以捕获多行调用。

答案 3 :(得分:0)

您可以使用slf4j的jul-to-slf4j模块将所有java.util.logging调用重定向到slf4j,然后您可以选择slf4j-nop模块来忽略所有日志记录语句。

这样做,还是你真的需要摆脱这些源线?

答案 4 :(得分:0)

使用工具注释掉或删除所有日志代码可能不是一个好主意。

您可能没有注意到副作用代码:

while ( x > 5)
{
    // some code here
    Logger.global.finest( "X is now bigger: " + (x++) );
}

这是一个非常明显的例子,但是对于方法调用或记录器调用中的某些内容,它可能非常微妙。

关闭日志记录输出或手动完成整个事情可能更安全......

答案 5 :(得分:0)

如果您希望避免评估参数,正如您在评论中所说,那么我假设您有如下调用:

logger.log("Expensive toString() operation on " + this);

你要禁用它?

如果是这种情况,并且它分散在您的代码中,我会使用类似AspectJ的内容来围绕上述所有实例:

if (loggingEnabled) {
   ...
}

并将loggingEnabled标志设置为false。