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

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

4

2 回答 2

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);
    }
}
于 2021-03-16T20:12:27.163 回答
1

到目前为止,这是不可能的。至少不是你想到的东西,比如干净的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 版本。

于 2021-03-16T20:35:19.913 回答