来自C#,我无法相信Java只有在调试程序时才能执行代码。不知何故,Log4J似乎能够做到这一点。有谁知道这种可能性?我在考虑这样的事情:
#if DEBUG
executedCode();
#endif
或类似的东西:
if (Java.isDebugging())
executeCode();
想法?
编辑:感谢Matt Ball,this中的代码可能重复:
public static boolean debugging = java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().indexOf("-agentlib:jdwp") > 0;
答案 0 :(得分:2)
我认为你正在将一个程序的 debug build 与在调试器下运行混淆(除非C#相当奇怪)。
许多系统 - 包括许多C / C ++构建环境,我希望C#,考虑到Microsoft历史上设计Visual Studio构建过程的方式 - 有两种不同类型的构建:
您在开发和调试程序时使用调试版本,并发布版本以进行最终的QA和发布。但是,调试版本与在调试器下运行无关 - 它们是普通程序,如果运行它们,它们仍会输出额外的日志记录信息。这非常有用。
在调试器下运行它们是完全正交的。您可以在调试器下运行发布版本(尽管缺少调试符号,它可能不是很有用)。实际上,我会提出您不希望代码根据您是否在调试器下运行而更改 - 这使得调试实际在应用程序中运行的代码变得相当困难。
与C,C ++和C#不同,Java没有编译时条件的功能,所以在程序中启用了所有内容。您通常可以通过非常快速的方式来检查是否要发出调试消息,并在不发生调试消息的情况下尽可能少地进行处理。
答案 1 :(得分:1)
C仅在调试时才执行代码,您显示的是条件编译指令,仅当标志值为true时才编译代码。运行代码不知道何时进行调试。与Log4j一样,它正在从其配置中读取要使用的级别,它不知道何时进行调试。
条件编译标志故意不在Java之外,他们希望避免复杂性。 C#有不同的理念。
答案 2 :(得分:0)
也许您正在考虑调试日志记录,这与使用调试器不同。
你会发现问题是Java有超过6个被广泛用于日志记录的库。
内置记录器。
http://docs.oracle.com/javase/1.4.2/docs/guide/util/logging/overview.html
Log4j被广泛使用,slf4j和Logback也很受欢迎。
甚至还有一些库可用于抽象出您实际使用的记录器,例如:公共伐木。
答案 3 :(得分:0)
您可以按照描述使用全局标记执行此操作。虽然它应该注意它不会自动检测,但您必须在开始调试之前自己更改标志。
public class Globals
{
public static final boolean debugFlag = false;
}
...后
if (Globals.debugFlag){...}
如果您想在调试时执行功能代码,则只需要这样做。它也是一种强力解决方案,因为你必须在任何地方打开它才能打开它。如果需要更多粒度,可以在要使用成员标志调试的特定类中执行类似操作。如果你想要的只是在调试块中记录,请参阅Peter关于记录库的答案。