#用于Java的ifdef在编译时删除finalize函数



我想找到一个编译时解决方案,根据标志删除类的finalize方法。这是为了避免GC的性能问题。

我的构建系统是ANT。

基本上,我想要这个C预处理器宏的等价物:

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

这在Java中可能吗?

根据javadoc

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

这意味着

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

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

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

简单的答案是没有内置的方法来做到这一点。请参阅Java条件编译:如何防止代码块被编译?了解更多详细信息。

但是,您可以使用替换任务使用Ant构建一个自定义解决方案。要做到这一点,你可以在你想要包含的区块周围的评论中放一些魔术串。

/******CONDITIONAL******
// conditional code goes here
*******CONDITIONAL*****/

然后使用replace删除基于某些条件属性的注释。

在编译时使用镜像api使用注释处理器(完全不确定)可能是可行的,但我想这可能很难实现。

也许在运行时使用Javassist或CGLib 也是可能的

例如,

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

相关内容

  • 没有找到相关文章

最新更新