0

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

我的构建系统是 ANT。

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

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

这在Java中可能吗?

4

4 回答 4

0

简短的回答是没有内置的方法可以做到这一点。请参阅Java 条件编译:如何防止编译代码块?更多细节。

但是,您可以使用替换任务使用 Ant 构建自定义解决方案。为此,您可以在有时想要包含的块周围的注释中添加一些魔术字符串。

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

// conditional code goes here

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

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

于 2013-07-20T01:24:51.357 回答
0

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

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

于 2013-07-20T01:26:29.447 回答
0

根据javadoc

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

意思就是

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

b) 如果你不包含 finalize() 方法 Object.finalize() 将被调用,这是无操作的。因此,除非您能以某种方式破解 jvm 甚至不调用 finalize,否则您无法对此进行改进。

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

于 2013-07-20T01:38:25.160 回答
0

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

于 2013-10-29T10:15:24.063 回答