Accommodate JDK17

The signatures of com.sun.tools.javac.main.CommandLine.parse and
com.sun.tools.javac.main.Arguments.init methods changed between JDK14
and JDK17, call these methods via reflection to accomodadte both.

Bug: 240421813
Test: build java extractor and use it
Change-Id: I5db0a22bf9f837826f234e228f9652d422d94f20
diff --git a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java
index 189ebe9..0c883ac 100644
--- a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java
+++ b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/AbstractJavacWrapper.java
@@ -34,6 +34,8 @@
 import com.sun.tools.javac.main.CommandLine;
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -148,7 +150,26 @@
 
   private static String[] getCleanedUpArguments(String[] args) throws IOException {
     // Expand all @file arguments
-    List<String> expandedArgs = Lists.newArrayList(CommandLine.parse(args));
+    // JDK changed the signature of the CommandLine.parse method in JDK15,
+    // support both versions
+    List<String> expandedArgs = null;
+    try {
+      try {
+        // JDK15+: the signature is
+        //     List<String> parse(List<String> args);
+        expandedArgs = (List<String>)CommandLine.class.getMethod("parse", List.class).invoke(null, (Object)Arrays.asList(args));
+      } catch (NoSuchMethodException nsme) {
+        // pre-JDK15:
+        //     String[] parse(String[]);
+        expandedArgs = Arrays.asList((String[])CommandLine.class.getMethod("parse", String[].class).invoke(null, (Object)args));
+      }
+    } catch (NoSuchMethodException ns2) {
+      System.err.printf("Cannot locate com.sun.tools.javac.main.CommandLine.parse method, JDK version %s\n", System.getProperty("java.version"));
+      System.exit(2);
+    } catch (InvocationTargetException|IllegalAccessException ex) {
+      System.err.printf("Cannot call com.sun.tools.javac.main.CommandLine.parse (JDK version %s):\n%s\n", System.getProperty("java.version"), ex);
+      System.exit(2);
+    }
 
     // We skip some arguments that would normally be passed to javac:
     // -J, these are flags to the java environment running javac.
diff --git a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java
index 1394f4e..31bc66a 100644
--- a/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java
+++ b/kythe/java/com/google/devtools/kythe/extractors/java/standalone/Javac9Wrapper.java
@@ -28,6 +28,8 @@
 import com.sun.tools.javac.util.Context;
 import com.sun.tools.javac.util.Options;
 import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.EnumSet;
@@ -46,7 +48,27 @@
 
     JavacFileManager fileManager = new JavacFileManager(context, true, null);
     Arguments args = Arguments.instance(context);
-    args.init("kythe_javac", arguments);
+    // JDK changed the signature of Arguments.init method, support both
+    try {
+      try {
+        // JDK15+: the signature is
+        //     init(String, Iterable<String> args);
+        Arguments.class.getMethod("init", String.class, Iterable.class)
+          .invoke(args, "kythe_javac", (Object) Arrays.asList(arguments));
+      } catch (NoSuchMethodException nsme) {
+        // pre-JDK15:
+        //     init(String, String...);
+        Arguments.class.getMethod("init", String.class,String[].class)
+          .invoke(args, "kythe_javac", (Object)arguments);
+      }
+    } catch (NoSuchMethodException ns2) {
+      System.err.printf("Cannot locate com.sun.tools.javac.main.Arguments.init method, JDK version %s\n", System.getProperty("java.version"));
+      System.exit(2);
+    } catch (InvocationTargetException|IllegalAccessException ex) {
+      System.err.printf("Cannot call com.sun.tools.javac.main.Arguments.init (JDK version %s):\n%s\n", System.getProperty("java.version"), ex);
+      System.exit(2);
+    }
+
     fileManager.handleOptions(args.getDeferredFileManagerOptions());
     Options options = Options.instance(context);