code: public void compile(List<JavaFileObject> sourceFileObjects,
                          List<String> classnames,
                          Iterable<? extends Processor> processors)
      {
          if (processors != null && processors.iterator().hasNext())
              explicitAnnotationProcessingRequested = true;
          // as a JavaCompiler can only be used once, throw an exception if
          // it has been used before.
          if (hasBeenUsed)
              throw new AssertionError("attempt to reuse JavaCompiler");
          hasBeenUsed = true;
  
          // forcibly set the equivalent of -Xlint:-options, so that no further
          // warnings about command line options are generated from this point on
          options.put(XLINT_CUSTOM.text + "-" + LintCategory.OPTIONS.option, "true");
          options.remove(XLINT_CUSTOM.text + LintCategory.OPTIONS.option);
  
          start_msec = now();
  
          try {
              initProcessAnnotations(processors);
  
              // These method calls must be chained to avoid memory leaks
              delegateCompiler =
                  processAnnotations(
                      enterTrees(stopIfError(CompileState.PARSE, parseFiles(sourceFileObjects))),
                      classnames);
  
              delegateCompiler.compile2();
              delegateCompiler.close();
              elapsed_msec = delegateCompiler.elapsed_msec;
          } catch (Abort ex) {
              if (devVerbose)
                  ex.printStackTrace(System.err);
          } finally {
              if (procEnvImpl != null)
                  procEnvImpl.close();
          }
      }
docs: Main method: compile a list of files, return all compiled classes
  
  @param sourceFileObjects file objects to be compiled
  @param classnames class names to process for annotations
  @param processors user provided annotation processors to bypass
  discovery, {@code null} means that no processors were provided