我想找一个编译时解决方案来根据标志删除我的类的finalize方法。这是为了避免使用GC performances issues。
我的构建系统是ANT。
基本上,我想要相当于这个C预处理器宏:
#ifdef USE_FINALIZE
protected finalize() {
...
}
#endif
这在Java中是否可行?
答案 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