@ReviseWhenPortedToJDK("9")
  private static @Nullable JavaVersion rtVersion() {
    try {
      Object version = Runtime.class.getMethod("version").invoke(null);
      int major = (Integer)version.getClass().getMethod("major").invoke(version);
      int minor = (Integer)version.getClass().getMethod("minor").invoke(version);
      int security = (Integer)version.getClass().getMethod("security").invoke(version);
      Object buildOpt = version.getClass().getMethod("build").invoke(version);
      int build = (Integer)buildOpt.getClass().getMethod("orElse", Object.class).invoke(buildOpt, Integer.valueOf(0));
      Object preOpt = version.getClass().getMethod("pre").invoke(version);
      boolean ea = (Boolean)preOpt.getClass().getMethod("isPresent").invoke(preOpt);
      return new JavaVersion(major, minor, security, build, ea);
    }
    catch (Throwable ignored) {
      return null;
    }
  }
@ReviseWhenPortedToJDK("9")
  private static @Nullable JavaVersion rtVersion()