Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java代码中,我如何检查jdk版本以编译下面的java代码?_Java_Compiler Construction_Java 13_Java 15 - Fatal编程技术网

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

在java代码中,我如何检查jdk版本以编译下面的java代码?,java,compiler-construction,java-13,java-15,Java,Compiler Construction,Java 13,Java 15,我想不加注释地使用上述代码Java没有条件编译,因此必须采取一些变通办法。一种方法是制作如下界面: // monitor.freeMemory = bean.getFreeMemorySize();//jdk 15 // monitor.maxMemory = bean.getTotalMemorySize(); // monitor.systemLoadAverage = bean.getCpuLoad(); monitor.freeMemory = bean.getFreePhysica

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

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();
此接口的实现应根据JVM版本使用反射调用适当的方法。类似这样(概念上):


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();
此接口的实现应根据JVM版本使用反射调用适当的方法。类似这样(概念上):


到目前为止,这是不可能的。至少不是你想到的,比如干净的
If/else
条件。如果我们的黑客攻击足够深入,我们就能以一种非常肮脏的方式让它发生

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

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

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);
    }
}
这段代码将能够从JDK 11编译并运行到JDK的所有新版本。但是,如果您切换到JDK 14,您将收到一条不推荐使用的警告


考虑到JDK11是LTS版本,他们不能将方法抛出窗口。最有可能的是,它们也将用于下一个LTS版本。

到目前为止,这是不可能的。至少不是你想到的,比如干净的
If/else
条件。如果我们的黑客攻击足够深入,我们就能以一种非常肮脏的方式让它发生

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

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

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);
    }
}
这段代码将能够从JDK 11编译并运行到JDK的所有新版本。但是,如果您切换到JDK 14,您将收到一条不推荐使用的警告


考虑到JDK11是LTS版本,他们不能将方法抛出窗口。最有可能的是,下一个LTS版本也可以使用它们。

如果他使用java16或更高版本(当/如果发生这种情况时)。。。还是java14?顺便说一句,真正的答案是:使用多态性。与其在每个方法中都进行这样的“切换”,为什么不使用不同的实现来创建不同的类,然后在实例化时只切换一次,根据JDK版本来确定要创建哪个类。。。还是java14?顺便说一句,真正的答案是:使用多态性。与其在每个方法中都进行这样的“切换”,为什么不使用不同的实现来创建不同的类,然后在实例化时根据JDK版本只切换一次,切换到哪个类
new()
,如果你把你的应用程序放在一个jar中,你可以通过使用来代替显式检查JVM,而不是显式检查,你可以通过使用来代替JVM检查