如何使用Java 9+在没有非法访问警告的情况下从Process获取pid?

时间:2018-10-24 17:16:48

标签: java reflection process pid java-9

我需要为启动的进程获取基础的OS PID。我现在使用的解决方案包括使用如下代码通过反射访问私有字段:

current_theme = shopify.Theme.find_first(role="main")
theme_css = shopify.Asset.find(key='assets/theme.scss.liquid', 
    theme_id=current_theme.id)

它可以工作,但是这种方法存在几个问题,一个是您需要在Windows上做额外的工作,因为Windows特定的Process子类不存储“ pid”字段,而是存储“ handle”字段(因此您需要做一些JNA来获取实际的pid),另一种情况是,从Java 9开始,它会触发一堆可怕的警告,例如“警告:发生了非法的反射访问操作”。

那么问题是:是否有更好的方法(干净,独立于操作系统,保证在将来的Java版本中不中断)获取pid?首先不应该由Java公开吗?

1 个答案:

答案 0 :(得分:7)

您可以利用Java9中引入的Process#pid,其示例如下:

ProcessBuilder pb = new ProcessBuilder("echo", "Hello World!");
Process p = pb.start();
System.out.printf("Process ID: %s%n", p.pid());

该方法的文档为:

* Returns the native process ID of the process.
* The native process ID is an identification number that the operating
* system assigns to the process.

同样值得注意的是

* @throws UnsupportedOperationException if the Process implementation
*         does not support this operation