Как получить pid от Process без предупреждения о незаконном доступе с Java 9+? - PullRequest
0 голосов
/ 24 октября 2018

Мне нужно получить базовый PID ОС для запускаемого мной процесса.Решение, которое я использую сейчас, включает в себя доступ к приватному полю посредством отражения с использованием кода, подобного следующему:

private long getLongField(Object target, String fieldName) throws NoSuchFieldException, IllegalAccessException {
    Field field = target.getClass().getDeclaredField(fieldName);
    field.setAccessible(true);
    long value = field.getLong(target);
    field.setAccessible(false);
    return value;
}

Это работает, но есть несколько проблем с этим подходом, одна из которых заключается в том, что вам нужно проделать дополнительную работу надWindows, потому что специфичный для Windows подкласс Process не хранит поле «pid», а поле «handle» (так что вам нужно сделать немного JNA, чтобы получить фактический pid), а другой, который запускается с Java 9, вызываеткуча страшных предупреждений, таких как «ПРЕДУПРЕЖДЕНИЕ: произошла недопустимая операция доступа с отражением».

Итак, вопрос: есть ли лучший способ (чистый, независимый от ОС, гарантированный, чтобы не сломаться в будущем выпуске Java)получить пид?Разве это не должно быть разоблачено Java в первую очередь?

1 Ответ

0 голосов
/ 24 октября 2018

Вы можете использовать Process#pid, представленный в Java9, пример которого будет следующим:

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
...