OsInfo增加isWindows11方法(pr#4054@Github)

This commit is contained in:
Looly 2025-09-03 16:48:09 +08:00
parent 4c61c23497
commit d05a023c63
5 changed files with 148 additions and 94 deletions

View File

@ -18,6 +18,7 @@ package cn.hutool.v7.extra.management;
import cn.hutool.v7.core.net.NetUtil;
import java.io.Serial;
import java.io.Serializable;
import java.net.InetAddress;
@ -25,19 +26,23 @@ import java.net.InetAddress;
* 代表当前主机的信息
*/
public class HostInfo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private final String HOST_NAME;
private final String HOST_ADDRESS;
private final String name;
private final String address;
/**
* 构造当前主机信息
*/
public HostInfo() {
final InetAddress localhost = NetUtil.getLocalhostV4();
if(null != localhost){
HOST_NAME = localhost.getHostName();
HOST_ADDRESS = localhost.getHostAddress();
name = localhost.getHostName();
address = localhost.getHostAddress();
} else{
HOST_NAME = null;
HOST_ADDRESS = null;
name = null;
address = null;
}
}
@ -51,7 +56,7 @@ public class HostInfo implements Serializable {
* @return 主机名
*/
public final String getName() {
return HOST_NAME;
return name;
}
/**
@ -64,7 +69,7 @@ public class HostInfo implements Serializable {
* @return 主机地址
*/
public final String getAddress() {
return HOST_ADDRESS;
return address;
}
/**

View File

@ -20,6 +20,7 @@ import cn.hutool.v7.core.regex.ReUtil;
import cn.hutool.v7.core.array.ArrayUtil;
import cn.hutool.v7.core.util.SystemUtil;
import java.io.Serial;
import java.io.Serializable;
/**
@ -28,13 +29,14 @@ import java.io.Serializable;
* @see ManagementUtil#getJavaInfo() 使用方式
*/
public class JavaInfo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private static final String JAVA_VERSION = SystemUtil.get("java.version", false);
private final float JAVA_VERSION_FLOAT = getJavaVersionAsFloat();
private final int JAVA_VERSION_INT = getJavaVersionAsInt();
private final String JAVA_VENDOR = SystemUtil.get("java.vendor", false);
private final String JAVA_VENDOR_URL = SystemUtil.get("java.vendor.url", false);
private static final String version = SystemUtil.get("java.version", false);
private final float versionFloat = getJavaVersionAsFloat();
private final int versionInt = getJavaVersionAsInt();
private final String vendor = SystemUtil.get("java.vendor", false);
private final String vendorUrl = SystemUtil.get("java.vendor.url", false);
private final boolean IS_JAVA_1_8 = getJavaVersionMatches("1.8");
private final boolean IS_JAVA_9 = getJavaVersionMatches("9");
@ -58,7 +60,7 @@ public class JavaInfo implements Serializable {
* @since Java 1.1
*/
public final String getVersion() {
return JAVA_VERSION;
return version;
}
/**
@ -75,7 +77,7 @@ public class JavaInfo implements Serializable {
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回{@code 0}
*/
public final float getVersionFloat() {
return JAVA_VERSION_FLOAT;
return versionFloat;
}
/**
@ -94,7 +96,7 @@ public class JavaInfo implements Serializable {
* @since Java 1.1
*/
public final int getVersionInt() {
return JAVA_VERSION_INT;
return versionInt;
}
/**
@ -113,13 +115,13 @@ public class JavaInfo implements Serializable {
* @since 6.0.1
*/
public final int getVersionIntSimple() {
if (JAVA_VERSION == null) {
if (version == null) {
return 0;
}
if (JAVA_VERSION.startsWith("1.")) {
return Integer.parseInt(JAVA_VERSION.split("\\.")[1]);
if (version.startsWith("1.")) {
return Integer.parseInt(version.split("\\.")[1]);
}
return Integer.parseInt(JAVA_VERSION.split("\\.")[0]);
return Integer.parseInt(version.split("\\.")[0]);
}
/**
@ -128,11 +130,11 @@ public class JavaInfo implements Serializable {
* @return Java版本的<code>float</code>值或{@code 0}
*/
private float getJavaVersionAsFloat() {
if (JAVA_VERSION == null) {
if (version == null) {
return 0f;
}
String str = JAVA_VERSION;
String str = version;
str = ReUtil.get("^[0-9]{1,2}(\\.[0-9]{1,2})?", str, 0);
@ -145,11 +147,11 @@ public class JavaInfo implements Serializable {
* @return Java版本的<code>int</code>值或{@code 0}
*/
private int getJavaVersionAsInt() {
if (JAVA_VERSION == null) {
if (version == null) {
return 0;
}
final String javaVersion = ReUtil.get("^[0-9]{1,2}(\\.[0-9]{1,2}){0,2}", JAVA_VERSION, 0);
final String javaVersion = ReUtil.get("^[0-9]{1,2}(\\.[0-9]{1,2}){0,2}", version, 0);
final String[] split = javaVersion.split("\\.");
String result = ArrayUtil.join(split, "");
@ -172,7 +174,7 @@ public class JavaInfo implements Serializable {
* @since Java 1.1
*/
public final String getVendor() {
return JAVA_VENDOR;
return vendor;
}
/**
@ -185,7 +187,7 @@ public class JavaInfo implements Serializable {
* @since Java 1.1
*/
public final String getVendorURL() {
return JAVA_VENDOR_URL;
return vendorUrl;
}
/**
@ -309,11 +311,11 @@ public class JavaInfo implements Serializable {
* @return 如果版本匹配则返回{@code true}
*/
private boolean getJavaVersionMatches(final String versionPrefix) {
if (JAVA_VERSION == null) {
if (version == null) {
return false;
}
return JAVA_VERSION.startsWith(versionPrefix);
return version.startsWith(versionPrefix);
}
/**

View File

@ -19,12 +19,14 @@ package cn.hutool.v7.extra.management;
import cn.hutool.v7.core.text.split.SplitUtil;
import cn.hutool.v7.core.util.SystemUtil;
import java.io.Serial;
import java.io.Serializable;
/**
* 代表当前运行的JRE的信息
*/
public class JavaRuntimeInfo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private final String JAVA_RUNTIME_NAME = SystemUtil.get("java.runtime.name", false);

View File

@ -18,43 +18,82 @@ package cn.hutool.v7.extra.management;
import cn.hutool.v7.core.util.SystemUtil;
import java.io.Serial;
import java.io.Serializable;
/**
* 代表当前OS的信息
*/
public class OsInfo implements Serializable{
public class OsInfo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private final String OS_VERSION = SystemUtil.get("os.version", false);
private final String OS_ARCH = SystemUtil.get("os.arch", false);
private final String OS_NAME = SystemUtil.get("os.name", false);
private final boolean IS_OS_AIX = getOSMatches("AIX");
private final boolean IS_OS_HP_UX = getOSMatches("HP-UX");
private final boolean IS_OS_IRIX = getOSMatches("Irix");
private final boolean IS_OS_LINUX = getOSMatches("Linux") || getOSMatches("LINUX");
private final boolean IS_OS_MAC = getOSMatches("Mac");
private final boolean IS_OS_MAC_OSX = getOSMatches("Mac OS X");
private final boolean IS_OS_OS2 = getOSMatches("OS/2");
private final boolean IS_OS_SOLARIS = getOSMatches("Solaris");
private final boolean IS_OS_SUN_OS = getOSMatches("SunOS");
private final boolean IS_OS_WINDOWS = getOSMatches("Windows");
private final boolean IS_OS_WINDOWS_2000 = getOSMatches("Windows", "5.0");
private final boolean IS_OS_WINDOWS_95 = getOSMatches("Windows 9", "4.0");
private final boolean IS_OS_WINDOWS_98 = getOSMatches("Windows 9", "4.1");
private final boolean IS_OS_WINDOWS_ME = getOSMatches("Windows", "4.9");
private final boolean IS_OS_WINDOWS_NT = getOSMatches("Windows NT");
private final boolean IS_OS_WINDOWS_XP = getOSMatches("Windows", "5.1");
private final boolean IS_OS_WINDOWS_7 = getOSMatches("Windows", "6.1");
private final boolean IS_OS_WINDOWS_8 = getOSMatches("Windows", "6.2");
private final boolean IS_OS_WINDOWS_8_1 = getOSMatches("Windows", "6.3");
private final boolean IS_OS_WINDOWS_10 = getOSMatches("Windows", "10.0");
private final String name;
private final String version;
private final String arch;
// 由于改变file.encoding属性并不会改变系统字符编码为了保持一致通过LocaleUtil取系统默认编码
private final String FILE_SEPARATOR = SystemUtil.get(SystemPropsKeys.FILE_SEPARATOR, false);
private final String LINE_SEPARATOR = SystemUtil.get(SystemPropsKeys.LINE_SEPARATOR, false);
private final String PATH_SEPARATOR = SystemUtil.get(SystemPropsKeys.PATH_SEPARATOR, false);
private final String fileSeparator;
private final String lineSeparator;
private final String pathSeparator;
private final boolean IS_OS_AIX;
private final boolean IS_OS_HP_UX;
private final boolean IS_OS_IRIX;
private final boolean IS_OS_LINUX;
private final boolean IS_OS_MAC;
private final boolean IS_OS_MAC_OSX;
private final boolean IS_OS_OS2;
private final boolean IS_OS_SOLARIS;
private final boolean IS_OS_SUN_OS;
private final boolean IS_OS_WINDOWS;
private final boolean IS_OS_WINDOWS_2000;
private final boolean IS_OS_WINDOWS_95;
private final boolean IS_OS_WINDOWS_98;
private final boolean IS_OS_WINDOWS_ME;
private final boolean IS_OS_WINDOWS_NT;
private final boolean IS_OS_WINDOWS_XP;
private final boolean IS_OS_WINDOWS_7;
private final boolean IS_OS_WINDOWS_8;
private final boolean IS_OS_WINDOWS_8_1;
private final boolean IS_OS_WINDOWS_10;
private final boolean IS_OS_WINDOWS_11;
/**
* 构造一个{@code OsInfo}对象用于取得当前OS的信息
*/
public OsInfo() {
this.name = SystemUtil.get("os.name", false);
this.version = SystemUtil.get("os.version", false);
this.arch = SystemUtil.get("os.arch", false);
this.fileSeparator = SystemUtil.get(SystemPropsKeys.FILE_SEPARATOR, false);
this.lineSeparator = SystemUtil.get(SystemPropsKeys.LINE_SEPARATOR, false);
this.pathSeparator = SystemUtil.get(SystemPropsKeys.PATH_SEPARATOR, false);
this.IS_OS_AIX = getOSMatches("AIX");
this.IS_OS_HP_UX = getOSMatches("HP-UX");
this.IS_OS_IRIX = getOSMatches("Irix");
this.IS_OS_LINUX = getOSMatches("Linux") || getOSMatches("LINUX");
this.IS_OS_MAC = getOSMatches("Mac");
this.IS_OS_MAC_OSX = getOSMatches("Mac OS X");
this.IS_OS_OS2 = getOSMatches("OS/2");
this.IS_OS_SOLARIS = getOSMatches("Solaris");
this.IS_OS_SUN_OS = getOSMatches("SunOS");
this.IS_OS_WINDOWS = getOSMatches("Windows");
this.IS_OS_WINDOWS_2000 = getOSMatches("Windows", "5.0");
this.IS_OS_WINDOWS_95 = getOSMatches("Windows 9", "4.0");
this.IS_OS_WINDOWS_98 = getOSMatches("Windows 9", "4.1");
this.IS_OS_WINDOWS_ME = getOSMatches("Windows", "4.9");
this.IS_OS_WINDOWS_NT = getOSMatches("Windows NT");
this.IS_OS_WINDOWS_XP = getOSMatches("Windows", "5.1");
this.IS_OS_WINDOWS_7 = getOSMatches("Windows", "6.1");
this.IS_OS_WINDOWS_8 = getOSMatches("Windows", "6.2");
this.IS_OS_WINDOWS_8_1 = getOSMatches("Windows", "6.3");
this.IS_OS_WINDOWS_10 = getOSMatches("Windows", "10.0");
this.IS_OS_WINDOWS_11 = getOSMatches("Windows 11");
}
/**
* 取得当前OS的架构取自系统属性{@code os.arch}
@ -64,11 +103,10 @@ public class OsInfo implements Serializable{
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回{@code null}
*
* @since Java 1.1
*/
public final String getArch() {
return OS_ARCH;
return arch;
}
/**
@ -79,11 +117,10 @@ public class OsInfo implements Serializable{
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回{@code null}
*
* @since Java 1.1
*/
public final String getName() {
return OS_NAME;
return name;
}
/**
@ -94,11 +131,10 @@ public class OsInfo implements Serializable{
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回{@code null}
*
* @since Java 1.1
*/
public final String getVersion() {
return OS_VERSION;
return version;
}
/**
@ -358,38 +394,20 @@ public class OsInfo implements Serializable{
* @return 如果当前OS类型为Windows 10则返回{@code true}
*/
public final boolean isWindows10() {
return IS_OS_WINDOWS_10;
return IS_OS_WINDOWS_10 && !IS_OS_WINDOWS_11;
}
/**
* 匹配OS名称
* 判断当前OS的类型
*
* @param osNamePrefix OS名称前缀
* <p>
* 如果不能取得系统属性{@code os.name}因为Java安全限制则总是返回{@code false}
* </p>
*
* @return 如果匹配则返回{@code true}
* @return 如果当前OS类型为Windows 11则返回{@code true}
*/
private boolean getOSMatches(final String osNamePrefix) {
if (OS_NAME == null) {
return false;
}
return OS_NAME.startsWith(osNamePrefix);
}
/**
* 匹配OS名称
*
* @param osNamePrefix OS名称前缀
* @param osVersionPrefix OS版本前缀
*
* @return 如果匹配则返回{@code true}
*/
private boolean getOSMatches(final String osNamePrefix, final String osVersionPrefix) {
if ((OS_NAME == null) || (OS_VERSION == null)) {
return false;
}
return OS_NAME.startsWith(osNamePrefix) && OS_VERSION.startsWith(osVersionPrefix);
public final boolean isWindows11() {
return IS_OS_WINDOWS_11;
}
/**
@ -400,11 +418,10 @@ public class OsInfo implements Serializable{
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回{@code null}
*
* @since Java 1.1
*/
public final String getFileSeparator() {
return FILE_SEPARATOR;
return fileSeparator;
}
/**
@ -415,11 +432,10 @@ public class OsInfo implements Serializable{
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回{@code null}
*
* @since Java 1.1
*/
public final String getLineSeparator() {
return LINE_SEPARATOR;
return lineSeparator;
}
/**
@ -430,11 +446,39 @@ public class OsInfo implements Serializable{
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回{@code null}
*
* @since Java 1.1
*/
public final String getPathSeparator() {
return PATH_SEPARATOR;
return pathSeparator;
}
/**
* 匹配OS名称
*
* @param osNamePrefix OS名称前缀
* @return 如果匹配则返回{@code true}
*/
private boolean getOSMatches(final String osNamePrefix) {
if (name == null) {
return false;
}
return name.startsWith(osNamePrefix);
}
/**
* 匹配OS名称
*
* @param osNamePrefix OS名称前缀
* @param osVersionPrefix OS版本前缀
* @return 如果匹配则返回{@code true}
*/
private boolean getOSMatches(final String osNamePrefix, final String osVersionPrefix) {
if ((name == null) || (version == null)) {
return false;
}
return name.startsWith(osNamePrefix) && version.startsWith(osVersionPrefix);
}
/**

View File

@ -16,6 +16,7 @@
package cn.hutool.v7.extra.management;
import cn.hutool.v7.core.lang.Console;
import cn.hutool.v7.core.util.SystemUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;