提交 97280e3a authored 作者: 吕本才's avatar 吕本才

fix(ProcessUtil): 优化跨平台进程PID获取逻辑

1. 添加JDK版本日志打印辅助调试 2. 修复UNIX进程PID获取的类型转换错误 3. 简化反射获取PID的逻辑,移除冗余代码 4. 调整代码格式优化可读性
上级 25fe27c4
...@@ -30,6 +30,7 @@ public class ProcessUtil { ...@@ -30,6 +30,7 @@ public class ProcessUtil {
public static String getProcessId(Process process) { public static String getProcessId(Process process) {
long pid = -1; long pid = -1;
Field field; Field field;
if (Platform.isWindows()) { if (Platform.isWindows()) {
try { try {
field = process.getClass().getDeclaredField("handle"); field = process.getClass().getDeclaredField("handle");
...@@ -39,6 +40,12 @@ public class ProcessUtil { ...@@ -39,6 +40,12 @@ public class ProcessUtil {
logger.error("get process id for windows error {0}", ex); logger.error("get process id for windows error {0}", ex);
} }
} else if (Platform.isLinux() || Platform.isAIX()) { } else if (Platform.isLinux() || Platform.isAIX()) {
// 方式一:系统属性
logger.info("JDK Version: {}", System.getProperty("java.version"));
// 方式二:Runtime.version() (Java 9+)
logger.info("JDK Version2: {}", Runtime.version());
try { try {
// Class<?> clazz = Class.forName("java.lang.UNIXProcess"); // Class<?> clazz = Class.forName("java.lang.UNIXProcess");
// field = clazz.getDeclaredField("pid"); // field = clazz.getDeclaredField("pid");
...@@ -47,7 +54,7 @@ public class ProcessUtil { ...@@ -47,7 +54,7 @@ public class ProcessUtil {
// 服务器上的jdk版本大于8 ,不兼容当前的模式 // 服务器上的jdk版本大于8 ,不兼容当前的模式
String processName = process.getClass().getName(); String processName = process.getClass().getName();
logger.info("processName: {}", processName); logger.info("processName: {}", processName);
if (processName.equals("java.lang.UNIXProcess")) { if (processName.equals("java.lang.UNIXProcess")) {
try { try {
// 仅Java 8兼容:保留原逻辑(可选) // 仅Java 8兼容:保留原逻辑(可选)
...@@ -63,13 +70,11 @@ public class ProcessUtil { ...@@ -63,13 +70,11 @@ public class ProcessUtil {
// Java 9+ 推荐方式:ProcessHandle API // Java 9+ 推荐方式:ProcessHandle API
pid = ((ProcessHandle) process).pid(); pid = ((ProcessHandle) process).pid();
} else { } else {
// JDK 9+ 降级方案:使用实际进程类反射获取 pid
logger.error("jdk8 换方法执行"); Class<?> clazz = process.getClass();
Class<?> clazz = Class.forName("java.lang.UNIXProcess");
Field declaredField = clazz.getDeclaredField("pid"); Field declaredField = clazz.getDeclaredField("pid");
declaredField.setAccessible(true); declaredField.setAccessible(true);
pid = declaredField.getInt(process); pid = declaredField.getLong(process);
// throw new UnsupportedOperationException("不支持当前JDK的进程ID获取");
} }
} catch (NoSuchMethodError e) { } catch (NoSuchMethodError e) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论