2

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

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

情况是我有一个用于调试函数调用的辅助类。这是在函数开始时实例化的,并在结束时进行调用。这是一个 JavaME 应用程序,所以我担心这会增加性能的开销。我已经有一个发布和调试版本,其中包含使用 ProGuard 的预处理器指令,所以我想从发布版本中排除使用这个帮助类。使用 ProGuard 似乎无法做到这一点。

4

4 回答 4

3

“这是在函数开始时实例化的,并在结束时进行调用。”

如果这遍及您的代码,您可能需要查看 AOP。

或助手类的状态设计模式,在测试模式下它做一件事,但在生产中它做另一件事(就像什么都没有)

于 2009-01-16T18:25:15.840 回答
1

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

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

于 2009-01-16T18:24:36.590 回答
0

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

这样,您的调试类就不会投入生产,并且您不必“静态链接”到它们,因此您的核心生产代码不会关心。当然,这只有在您的调试代码对核心代码没有可见的副作用时才有可能,但似乎就是您的情况(根据您的问题描述)。

于 2009-01-16T18:35:34.087 回答
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”。当调试模式关闭时,任何方法都不做任何事情(当然,除了检查调试模式的状态)。

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

如果您也有一个多线程应用程序,这将需要更多的工作。

于 2009-01-16T18:41:32.000 回答