我想找到一个编译时解决方案,根据标志删除类的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