#ifdef for Java在编译时删除finalize函数

时间:2013-07-20 01:09:04

标签: java ant compilation preprocessor compile-time

我想找一个编译时解决方案来根据标志删除我的类的finalize方法。这是为了避免使用GC performances issues

我的构建系统是ANT。

基本上,我想要相当于这个C预处理器宏:

#ifdef USE_FINALIZE
protected finalize() {
  ...
}
#endif

这在Java中是否可行?

4 个答案:

答案 0 :(得分:0)

简短的回答是没有内置的方法来做到这一点。有关详细信息,请参阅Java conditional compilation: how to prevent code chunks from being compiled?

但是,您可以使用replace task使用Ant构建自定义解决方案。要做到这一点,你可以在你想要包含的块周围的注释中加入一些魔术字符串。

/******CONDITIONAL******

// conditional code goes here

*******CONDITIONAL*****/

然后使用replace根据某些条件属性删除这些注释。

答案 1 :(得分:0)

在编译时,使用镜像api可能有一个注释处理器(根本不确定),但我想这可能很难实现。

也许在运行时也可以使用Javassist或CGLib

答案 2 :(得分:0)

根据javadoc

  

Object类的finalize方法不执行任何特殊操作;它只是正常返回。 Object的子类可以覆盖此定义。

这意味着

a)除非您在代码中明确声明,否则您不会进行任何特殊的定稿,并且

b)如果不包含finalize()方法,将调用Object.finalize(),这是no-op。所以除非你能以某种方式破解jvm甚至不调用finalize,否则你无法改进。

更好的问题可能是,您是否有特定理由担心申请中的最终确定时间?你有没有想过这个?完全有可能这在您的应用程序中不是问题。

答案 3 :(得分:0)

只使用java预处理器,例如https://github.com/raydac/java-comment-preprocessor它支持ANT和MAVEN