test/jdk/sun/tools/jcmd/TestProcessHelper.java
changeset 58265 577e17cab93f
parent 58143 b35771556cd0
child 58679 9c3209ff7550
--- a/test/jdk/sun/tools/jcmd/TestProcessHelper.java	Mon Sep 23 11:37:08 2019 +0200
+++ b/test/jdk/sun/tools/jcmd/TestProcessHelper.java	Mon Sep 23 12:32:13 2019 +0200
@@ -21,16 +21,13 @@
  * questions.
  */
 
-import jdk.internal.module.ModuleInfoWriter;
-import jdk.test.lib.JDKToolFinder;
-import jdk.test.lib.process.ProcessTools;
-import jdk.test.lib.util.JarUtils;
-import sun.tools.common.ProcessHelper;
-
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
 import java.lang.module.ModuleDescriptor;
+import java.lang.reflect.Method;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -44,6 +41,11 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import jdk.internal.module.ModuleInfoWriter;
+import jdk.test.lib.JDKToolFinder;
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.util.JarUtils;
+
 /*
  * @test
  * @bug 8205654
@@ -52,15 +54,13 @@
  *
  * @requires os.family == "linux"
  * @library /test/lib
- * @modules jdk.jcmd/sun.tools.common
+ * @modules jdk.jcmd/sun.tools.common:+open
  *          java.base/jdk.internal.module
  * @build test.TestProcess
  * @run main/othervm TestProcessHelper
  */
 public class TestProcessHelper {
 
-    private ProcessHelper PROCESS_HELPER = ProcessHelper.platformProcessHelper();
-
     private static final String TEST_PROCESS_MAIN_CLASS_NAME = "TestProcess";
     private static final String TEST_PROCESS_MAIN_CLASS_PACKAGE = "test";
     private static final String TEST_PROCESS_MAIN_CLASS = TEST_PROCESS_MAIN_CLASS_PACKAGE + "."
@@ -89,6 +89,29 @@
 
     private static final String[] PATCH_MODULE_OPTIONS = {"--patch-module", null};
 
+    private static final MethodHandle MH_GET_MAIN_CLASS = resolveMainClassMH();
+
+    private static MethodHandle resolveMainClassMH() {
+        try {
+            Method getMainClassMethod = Class
+                .forName("sun.tools.common.ProcessHelper")
+                .getDeclaredMethod("getMainClass", String.class);
+            getMainClassMethod.setAccessible(true);
+            return MethodHandles.lookup().unreflect(getMainClassMethod);
+        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static String callGetMainClass(Process p) {
+        try {
+            return (String)MH_GET_MAIN_CLASS.invoke(Long.toString(p.pid()));
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
     public static void main(String[] args) throws Exception {
         new TestProcessHelper().runTests();
     }
@@ -188,7 +211,7 @@
     }
 
     private void checkMainClass(Process p, String expectedMainClass) {
-        String mainClass = PROCESS_HELPER.getMainClass(Long.toString(p.pid()));
+        String mainClass = callGetMainClass(p);
         // getMainClass() may return null, e.g. due to timing issues.
         // Attempt some limited retries.
         if (mainClass == null) {
@@ -204,7 +227,7 @@
                 } catch (InterruptedException e) {
                     // ignore
                 }
-                mainClass = PROCESS_HELPER.getMainClass(Long.toString(p.pid()));
+                mainClass = callGetMainClass(p);
                 retrycount++;
                 sleepms *= 2;
             }