【问题标题】:At java code, how i can check jdk version to compile below java code?在 java 代码中,我如何检查 jdk 版本以在 java 代码下编译?
【发布时间】:2021-06-14 03:35:45
【问题描述】:
// monitor.freeMemory = bean.getFreeMemorySize();//jdk 15
// monitor.maxMemory = bean.getTotalMemorySize();
// monitor.systemLoadAverage = bean.getCpuLoad();


monitor.freeMemory = bean.getFreePhysicalMemorySize();//jdk 13
monitor.freeMemory = bean.getTotalPhysicalMemorySize();
monitor.systemLoadAverage = bean.getSystemCpuLoad();

我想使用上面的代码而不加注释

【问题讨论】:

  • 如果您将应用程序放入 jar(s) 中, 您可以使用multi-release jar 让 JVM 为您检查,而不是显式检查

标签: java compiler-construction java-13 java-15


【解决方案1】:

Java 没有条件编译,因此必须采取一些变通方法。一种方法是制作这样的界面:

interface monitor {
  public void getFree();
  public void getTotal();
  public void getCpu();
}

此接口的实现应根据 JVM 版本使用反射调用适当的方法。像这样(概念上):

public void getFree() {
    if (System.getProperty("java.version").equals(JDK_15_VERSION)) {
        Class myclass = Class.forName("my.class.JDK_15_NAME");
        Object myobject = myclass.newInstance();
        Method method = myclass.getDeclaredMethod("FREE_MEM_JDK_15_METHOD", null);
        method.invoke(obj, null);
    }
    else {
        Class myclass = Class.forName("my.class.JDK_13_NAME");
        Object myobject = myclass.newInstance();
        Method method = myclass.getDeclaredMethod("FREE_MEM_JDK_13_METHOD", null);
        method.invoke(obj, null);
    }
}

【讨论】:

  • 如果他 java16 或更高版本(何时/如果发生这种情况)...... OR java14?
  • 真正的答案顺便说一句:使用多态性。与其在每个方法中进行这样的“切换”,为什么不使用不同的类,使用不同的实现,然后只切换一次,在实例化时根据 JDK 版本将哪个类切换到new()
【解决方案2】:

到目前为止,这是不可能的。至少不是您想到的,例如干净的If/else 条件。如果我们破解得足够深,我们就可以做到这一点,不过是以一种非常肮脏的方式。

这就是方法被弃用的原因。他们不会把东西扔出窗外,因此必须用另一种方法编译项目。它们为那些已弃用的方法提供了足够的时间,以便您可以安全地继续前进。

您的问题也是如此。您的项目可以使用相同的代码使用 JDK 13 或 JDK 15 进行编译。

com.sun.management.OperatingSystemMXBean bean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
bean.getFreePhysicalMemorySize();
bean.getTotalPhysicalMemorySize();
bean.getSystemCpuLoad();

此代码将能够从 JDK 11 到所有新版本的 JDK 进行编译和运行。但是,如果您切换到 JDK 14,您将收到已弃用的警告。

考虑到 JDK 11 是 LTS 版本,他们无法将方法抛到窗外。很可能它们也可用于下一个 LTS 版本。

【讨论】:

    最近更新 更多