【问题标题】:#ifdef for Java to remove finalize function at compile time#ifdef for Java 在编译时删除 finalize 函数
【发布时间】:2013-07-19 10:06:53
【问题描述】:

我想找到一个编译时解决方案,以根据标志删除我的类的 finalize 方法。这是为了避免 performances issues 带有 GC。

我的构建系统是 ANT。

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

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

这在 Java 中可行吗?

【问题讨论】:

    标签: java ant compilation preprocessor compile-time


    【解决方案1】:

    根据 javadoc

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

    这意味着

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

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

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

    【讨论】:

    • 由于我的项目使用 JNI,我必须在 finalize 中释放原生对象。虽然我没有对此进行基准测试,但我认为它可能会大大降低我的性能(在短时间内大量 jni => java 调用 + GC)。因此,根据您对 javadoc 的参考,最好的解决方案是知道实现 finalize 并依靠静态标志来执行或不执行本机处置操作。很好的答案,这正是我想要的。
    【解决方案2】:

    简短的回答是没有内置的方法可以做到这一点。详情请见Java conditional compilation: how to prevent code chunks from being compiled?

    但是,您可以使用 Ant 使用 replace task 构建自定义解决方案。为此,您可以在 cmets 中围绕您有时想要包含的块放置一些魔术字符串。

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

    然后根据一些条件属性使用replace来移除那些cmet。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-22
          • 1970-01-01
          • 2017-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-15
          相关资源
          最近更新 更多