private synchronized Object assignableProcessLauncher(Class<?> requiredType) {
    if (processLauncherProxy == null) {
      // Assume that only start() will be called, and simply delegate to this builder's launcher
      InvocationHandler handler =
          (proxy, method, args) -> processLauncher.start((ProcessBuilder) args[0]);
      ClassLoader classLoader = requiredType.getClassLoader();
      Class<?>[] interfaces = {requiredType};
      processLauncherProxy = Proxy.newProxyInstance(classLoader, interfaces, handler);
    }
    return processLauncherProxy;
  }
Because the exec handle created by Gradle uses a classloader different from ours, we can't
simply construct a Gradle {@code ProcessLauncher} to assign. Instead we create proxy, using the
exec handle's classloader.
build-tools/geode-testing-isolation/src/main/java/org/apache/geode/gradle/testing/process/LauncherProxyWorkerProcessBuilder.java