JAVA\仅在运行时编译一个函数

标签 java jvm runtime jit

我的代码被用作两个大版本的一部分,并与外部接口(interface)交互。 在其中一个版本中添加了新的 API(我需要调用一个新方法)。

我想避免维护我的代码的两个版本,并使用 if 语句:

If VersionX
   Do Method1()
If VersionY
   Do Method2()

假设 method2() 是我需要调用的新函数,有没有一种方法可以让代码仅在运行时编译(意味着如果我在 VersionX 上运行系统,虽然method 2()不存在,但不会有编译和异常的问题)?

最佳答案

您可以使用一个接口(interface)和两个类来实现:

interface API {
    void Method();
}

class APIX implements API {
    void Method() {
        someInstance.Method1();
    }
}

class APIY implements API {
    void Method() {
        anotherInstance.Method2();
    }
}

然后根据当前版本,创建 APIXAPIY 的实例:

API api;
if (isVersionX) 
    api = new APIX();
else
    api = new APIY();
api.Method();

此代码是针对包含这两种方法的较新 API 编译的。由于类加载只是按需加载,因此当只有旧 API 可用并且您在运行时没有任何冲突时,不会加载使用较新方法的类。

关于JAVA\仅在运行时编译一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6166404/

相关文章:

java - Eclipse,在自动生成的代码中更改异常变量名称

java - 转换为通用类型 (T) 给出 "unchecked cast"警告

java - 当调用 System.gc() 或 finalize() 方法时,内部(JVM)发生了什么?

java - 如何找到哪个Finalizer耗时

android - 如何在运行时更改 Android Actionbar Stackedbar 选项卡的样式?

c# - 我收到 System.NullReferenceException : Object reference not set to an instance of an object when trying to add a value to an array at runtime

go - Go 运行时中的中间轮 AES 加密是如何工作的?

java - 什么是最好的java安装工具?

java - Kotlin 。 Java 和 PHP 与 MySQL 的性能

java - JVM的空闲空间是否可以被其他应用程序使用