JAVA \ 仅在运行时编译函数

发布于 2024-11-10 04:25:01 字数 324 浏览 3 评论 0原文

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

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

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

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

My code is used as part of two big versions and interact with external interface.
In one of the versions new API was added (I need to call a new method).

I would like to prevent maintaining two versions of my code, and use if statement:

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

assuming method2() is the new function I need to call, is there a way that the code can compile only on runtime (means that if I run on VersionX system, there would be no problem of compilation and exceptions though method 2() does not exist there)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

骑趴 2024-11-17 04:25:01

您可以使用一个接口和两个类来实现此目的:

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 可用且运行时不存在任何冲突时,不会加载使用较新方法的类。

You can achieve this with an interface and two classes:

interface API {
    void Method();
}

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

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

Then depending on the current version, you create an instance of either APIX or APIY:

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

This code is compiled against the newer API wich contains both methods. Since class loading is on demand only, the class using the newer method is not loaded when only the old API is available and you don't have any conflicts at run-time.

内心荒芜 2024-11-17 04:25:01

如果该方法存在,您可以使用反射来调用该方法。

// calls a method if it exists or throws an exception.
Method method = object.getClass().getMethod("DoMethod1");
method.invoke(object);

You can use reflection to call the method if it exists.

// calls a method if it exists or throws an exception.
Method method = object.getClass().getMethod("DoMethod1");
method.invoke(object);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文