Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在编译时删除某些Java类的使用_Java_Preprocessor - Fatal编程技术网

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

在编译时删除某些Java类的使用,java,preprocessor,Java,Preprocessor,我正在寻找一种在编译时删除特定类的所有用法的方法,包括类本身。基本上是一种预处理形式,但我希望这样做,而不必使用#ifdebug#endif 有没有基于ant的工具可以做到这一点?如果没有,有人能告诉我如何编写这样一个工具的正确方向吗?(我知道这不是一个小任务,但如果它是唯一的选择…) 情况是我有一个用于调试函数调用的助手类。这在函数的开头实例化,并在结尾进行调用。这是一个JavaME应用程序,因此我担心这会增加性能开销。我已经有了一个发布和调试版本,其中包含使用ProGuard的预处理器指令,

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

有没有基于ant的工具可以做到这一点?如果没有,有人能告诉我如何编写这样一个工具的正确方向吗?(我知道这不是一个小任务,但如果它是唯一的选择…)


情况是我有一个用于调试函数调用的助手类。这在函数的开头实例化,并在结尾进行调用。这是一个JavaME应用程序,因此我担心这会增加性能开销。我已经有了一个发布和调试版本,其中包含使用ProGuard的预处理器指令,因此我想从发布版本中排除使用这个帮助器类。似乎这不能用ProGuard完成。

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

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

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

如果你的代码都是这样的话,也许你需要看看AOP


或者帮助器类的状态设计模式,在测试模式下它做一件事,但在prod中它做另一件事(类似于nothing)

不完全是您想要的,但是…
您可以将代码分离为模块(在您的例子中是core和debug),然后确保模块通过反射相互调用:使用core中可用的接口,在core中创建一个包装类,该类将通过反射细节隐藏对象实例化/ 然后,在生产环境中,只要省略调试代码,并在实例化失败/设置特定标志时让包装器“不做任何事情”

这样,您的调试类就不会进入生产环境,您也不必“静态链接”到它们,这样您的核心生产代码就不会在意了。
当然,这只有在调试代码没有对核心代码可见的副作用的情况下才可能,但这似乎是您的情况(从您的问题描述来看)。

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

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”。当调试模式关闭时,所有方法都不会执行任何操作(当然,除了检查调试模式的状态)

您无法避免函数调用的开销,您确实需要检查该布尔值的状态,但您确实可以避免在试图避免加载类的情况下跳转


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

用于调试函数调用的助手类。。。。。。性能测试?
#如果DEBUG
在Java中不是一个已知的关键字,但您可以使用如上所述的DEBUG常量。如果您将debugOn设置为static和final,并跳过setDebugMode()方法,编译器很可能能够优化函数调用。即使不能,它也应该能够优化start()和end()的方法体。在我的工作中,每个层(staging、prelive、live)都有自己的属性文件。在这种情况下,DEBUG_MODE属性将在暂存时处于打开状态,但在live中处于关闭状态。也许OPs环境是类似的……您可以将AOP与JavaME一起使用吗?一个快速的谷歌并没有透露任何结论性的信息……寻找AspectJ