在java代码中,我如何检查jdk版本以编译下面的java代码?
我想不加注释地使用上述代码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
// 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检查