我想找到一个编译时解决方案来根据标志删除我的类的 finalize 方法。这是为了避免GC 的性能问题。
我的构建系统是 ANT。
基本上,我想要这个 C 预处理器宏的等价物:
#ifdef USE_FINALIZE
protected finalize() {
...
}
#endif
这在Java中可能吗?
我想找到一个编译时解决方案来根据标志删除我的类的 finalize 方法。这是为了避免GC 的性能问题。
我的构建系统是 ANT。
基本上,我想要这个 C 预处理器宏的等价物:
#ifdef USE_FINALIZE
protected finalize() {
...
}
#endif
这在Java中可能吗?
简短的回答是没有内置的方法可以做到这一点。请参阅Java 条件编译:如何防止编译代码块?更多细节。
但是,您可以使用替换任务使用 Ant 构建自定义解决方案。为此,您可以在有时想要包含的块周围的注释中添加一些魔术字符串。
/******CONDITIONAL******
// conditional code goes here
*******CONDITIONAL*****/
然后使用 replace 根据某些条件属性删除这些注释。
使用镜像 api 在编译时使用注释处理器(完全不确定)可能是可能的,但我猜它可能很难实现。
也许在运行时也可以使用 Javassist 或 CGLib
根据javadoc
Object 类的 finalize 方法不执行任何特殊操作;它只是正常返回。Object 的子类可以覆盖这个定义。
意思就是
a)除非您在代码中明确声明它,否则您不会进行任何特殊的最终确定,并且
b) 如果你不包含 finalize() 方法 Object.finalize() 将被调用,这是无操作的。因此,除非您能以某种方式破解 jvm 甚至不调用 finalize,否则您无法对此进行改进。
一个更好的问题可能是,您是否有特定的理由担心您的应用程序的完成时间?你有没有介绍过这个?这完全有可能在您的应用程序中不是问题。
只需使用 java 预处理器,例如https://github.com/raydac/java-comment-preprocessor它支持 ANT 和 MAVEN