微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在java代码中,我如何检查jdk版本以在java代码下编译?

如何解决在java代码中,我如何检查jdk版本以在java代码下编译?

// 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();

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

解决方法

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);
    }
}
,

直到现在这是不可能的。至少不是您想到的东西,例如干净的 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,您将收到已弃用的警告。

enter image description here

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。