code: @Override
      public JavaFileObject getJavaFileForOutput(JavaFileManager.Location location,
              String className, Kind kind, FileObject sibling) throws IOException {
  
          OutputMemoryJavaFileObject fo;
          fo = new OutputMemoryJavaFileObject(className, kind);
          classObjects.put(className, fo);
          proc.debug(DBG_FMGR, "Set out file: %s = %s\n", className, fo);
          if (classListener != null) {
              classListener.newClassFile(fo, location, className, kind, sibling);
          }
          return fo;
      }
docs: Returns a {@linkplain JavaFileObject file object} for output
  representing the specified class of the specified kind in the
  given location.
  
  <p>Optionally, this file manager might consider the sibling as
  a hint for where to place the output.  The exact semantics of
  this hint is unspecified.  The JDK compiler, javac, for
  example, will place class files in the same directories as
  originating source files unless a class file output directory
  is provided.  To facilitate this behavior, javac might provide
  the originating source file as sibling when calling this
  method.
  
  @param location a location
  @param className the name of a class
  @param kind the kind of file, must be one of {@link
  JavaFileObject.Kind#SOURCE SOURCE} or {@link
  JavaFileObject.Kind#CLASS CLASS}
  @param sibling a file object to be used as hint for placement;
  might be {@code null}
  @return a file object for output
  @throws IllegalArgumentException if sibling is not known to
  this file manager, or if the location is not known to this file
  manager and the file manager does not support unknown
  locations, or if the kind is not valid
  @throws IOException if an I/O error occurred, or if {@link
  #close} has been called and this file manager cannot be
  reopened
  @throws IllegalStateException {@link #close} has been called
  and this file manager cannot be reopened