在编译时删除某些Java类的使用

时间:2009-01-16 18:05:42

标签: java preprocessor

我正在寻找一种方法来在编译时删除特定类的所有用法,包括类本身。基本上是一种预处理形式,但我想这样做而不必用#ifdebug ... #endif包围所有实例。

有没有任何基于蚂蚁的工具可以做到这一点?如果没有,有人能指出我如何编写这样一个工具的正确方向吗? (这不是我所知道的小事,但如果它是唯一的选择......)

情况是我有一个用于调试函数调用的辅助类。这在函数的开头实例化,并在最后进行调用。这是一个JavaME应用程序,所以我对这增加性能的开销感到紧张。我已经有一个使用ProGuard的预处理器指令的发布和调试版本,所以我想从发布版本中排除使用这个帮助器类。使用ProGuard似乎无法做到这一点。

4 个答案:

答案 0 :(得分:3)

“这在函数开头实例化,最后调用。”

如果你的代码全部结束,也许你需要看一下AOP。

或帮助类的状态设计模式,在测试模式下它做了一件事,但在prod它做了另一件事(没什么)

答案 1 :(得分:1)

您是否知道此调试代码会使JavaME应用程序变慢?您还可以尝试创建一种有条件地调用这些调试方法的方法。

还有一些想法...我从未编写过JavaME应用程序,但我认为有办法在实际设备上运行/测试。鉴于这种运行/测试方式,您可以使用Eclipse / Netbeans来调试代码并使用正确的断点而不是以编程方式跟踪方法调用。在这种情况下,对编译代码没有损害。还要考虑使用AspectJ来跟踪方法调用,这可以在编译代码之后有条件地完成,因为AspectJ直接改变字节码(不确定它如何与JavaME一起使用)。最后,我听说有人在Java上使用标准的GNU C / C ++预处理器。我不知道它是否有效,谷歌会帮助你。

答案 2 :(得分:0)

不完全是你想要的但是...... 您可以将代码分离到模块(核心和调试,在您的情况下),然后确保模块通过反射相互调用:使用核心中可用的接口,在核心中创建一个包装类,通过反射细节隐藏对象实例化/ 然后,在生产时,只需省略调试代码,并在实例化失败/设置特定标志时让包装器“不执行任何操作”。

通过这种方式,您的调试类不会将其投入生产,您不必“静态链接”它们,因此您的核心生产代码将无关紧要。 当然,这只有在您的调试代码没有核心代码可见的副作用的情况下才有可能,但似乎是您的情况(来自您的问题描述)。

答案 3 :(得分:0)

是否可以在应用程序启动时创建一次类,而不是为每个方法创建一个实例?您的调试类可能如下所示:

public class Debug // maybe make this a *gasp* singleton?
{
    public static void start(); // called at start of method
    public static void end();   // called at end, probably should be in a finally block

    public static void setDebugMode(boolean debugOn); // turn off for production mode
}

在测试中将调试模式设置为“true”,但在生产中将“false”设置为“false”。当调试模式关闭时,没有任何方法可以做任何事情(除了检查调试模式的状态,当然)。

你不会避免函数调用的开销,而你确实需要检查该布尔值的状态,但你确实可以避免跳过箍,试图避免加载该类。

如果您有多线程应用程序,这还需要更多工作。