JavaTM Platform
Standard Ed. 6

javax.tools
인터페이스 JavaCompiler

모든 슈퍼 인터페이스:
OptionChecker , Tool


public interface JavaCompiler
extends Tool , OptionChecker

Java 프로그램으로부터 Java™ 프로그램 언어 컴파일러를 호출하는 인터페이스입니다.

컴파일러는, 컴파일중에 에러 메세지등의 진단 정보를 생성하는 일이 있습니다. 진단 청취자가 지정되고 있는 경우, 진단 정보는 이 청취자에게 제공됩니다. 청취자가 지정되어 있지 않은 경우, 진단 정보는 하등의 형식 (미지정)에서 포맷 되어 디폴트의 출력에 기입해집니다. 이 디폴트의 출력은, 특히 지정되어 있지 않으면 System.err 가 됩니다. 진단 청취자가 지정되고 있어도, 일부의 진단 정보가 Diagnostic 에 적합하지 않는 경우가 있습니다. 이 경우, 이 진단 정보는 디폴트의 출력에 기입해집니다.

컴파일러 툴에는, 표준 파일 관리자-가 관련지을 수 있고 있습니다. 이 파일 관리자-는, 컴파일러 툴의 네이티브의 (편입형의) 파일 관리자-입니다. 표준 파일 관리자-를 가져오려면 ,getStandardFileManager 를 호출합니다.

컴파일러 툴은, 추가 요건 (자세한 것은 아래와 같은 메소드를 참조)이 채워지고 있는 한은, 임의의 파일 관리자-로 기능할 필요가 있습니다. 파일 관리자-가 지정되지 않았던 경우, 컴파일러 툴은, 표준 파일 관리자- (예를 들어 getStandardFileManager 에 의해 반환되는 파일 관리자-)를 사용합니다.

이 인터페이스를 구현하는 인스턴스는, 「Java 언어 스펙」에 준거하고 있어, 한편 「Java 가상 머신 스펙」에 준거한 클래스 파일을 생성할 필요가 있습니다. 이러한 스펙의 버젼은,Tool 인터페이스에 정의되고 있습니다. 게다가 이 인터페이스의 인스턴스 가운데,SourceVersion.RELEASE_6 이상을 지원하는 것은,주석 처리도 지원할 필요가 있습니다.

컴파일러는,진단 청취자파일 관리자-의 2 개의 서비스에 의존하고 있습니다. 이 패키지에 포함되는 대부분의 클래스 및 인터페이스는 컴파일러 ( 및 툴 일반)의 API 를 정의하고 있습니다만,DiagnosticListener ,JavaFileManager ,FileObject , 및 JavaFileObject 의 각 인터페이스는 어플리케이션으로 사용하기 위한의 것이 아닙니다. 이러한 인터페이스는, 컴파일러용의 커스텀 서비스를 제공하는 목적으로 구현되어 사용됩니다. 따라서, 컴파일러의 SPI 를 정의합니다.

이 패키지에는, SPI 의 구현을 간편화해, 컴파일러의 동작을 커스터마이즈하기 위한 클래스 및 인터페이스가 다수 포함되어 있습니다.

StandardJavaFileManager
이 인터페이스를 구현하는 모든 컴파일러는, 일반적으로 파일을 조작하는 표준 파일 관리자-를 제공합니다. StandardJavaFileManager 인터페이스는, 일반적으로 파일로부터 파일 객체를 작성하는 추가 메소드를 정의합니다.

표준 파일 관리자-에는, 다음의 2 개의 용도가 있습니다.

파일 관리자-를 재사용하는 것으로, 파일 시스템의 스캔과 jar 파일의 읽기의 오버헤드가 잠재적으로 삭감될 가능성이 있습니다. 오버헤드가 삭감되지 않는 경우에서도, 표준 파일 관리자-는 복수의 컴파일 태스크를 차례차례 처리할 필요가 있습니다. 다음의 예의 같은 코딩 패턴을 추천합니다.

Files[] files1 = ...; // 최초의 컴파일 태스크의 입력
Files[] files2 = ...; // 2 번째의 컴파일 태스크의 입력

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

Iterable<?  extends JavaFileObject> compilationUnits1 =
fileManager.getJavaFileObjectsFromFiles(Arrays.asList (files1));
compiler.getTask(null, fileManager, null, null, null, compilationUnits1). call();

Iterable<?  extends JavaFileObject> compilationUnits2 =
fileManager.getJavaFileObjects(files2); // 대체 메소드를 사용
// jar 파일의 캐쉬를 유효하게 하기 위한(해) 같은 파일 관리자-를 재사용
compiler.getTask(null, fileManager, null, null, null, compilationUnits2). call();

fileManager.close();
DiagnosticCollector
진단 정보를 수집해, 리스트화하기 위해서(때문에) 사용합니다. 다음에 예를 나타냅니다.
Iterable<?  extends JavaFileObject> compilationUnits = ...;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits). call();

for (Diagnostic diagnostic :diagnostics.getDiagnostics())
System.out.format("Error on line %d in %d%n",
diagnostic.getLineNumber()
diagnostic.getSource(). toUri());

fileManager.close();
ForwardingJavaFileManager ,ForwardingFileObject , 및 ForwardingJavaFileObject
표준 파일 관리자-의 동작을 오버라이드(override) 하는 목적으로 서브 클래스화를 실시할 수 없습니다. 이것은, 표준 파일 관리자-가 생성자 의 호출에 의해 작성된 것은 아니고, 컴파일러로 메소드를 호출하는 것에 의해 작성된 것이기 때문입니다. 서브 클래스화 대신에, 전송 (또는 위양)을 사용할 필요가 있습니다. 이러한 클래스를 사용하면(자), 대부분의 호출을 간단하게 지정의 파일 관리자-또는 파일 객체에 전송 가능할 뿐만 아니라, 파일 관리자-의 동작을 커스터마이즈 할 수도 있습니다. 예를 들어,JavaFileManager.flush() 의 호출을 모두 로그에 기록하려면 , 다음과 같이 합니다.
final Logger  logger = ...;
Iterable<?  extends JavaFileObject> compilationUnits = ...;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, null, null);
JavaFileManager fileManager = new ForwardingJavaFileManager(stdFileManager) {
public void flush() {
logger.entering(StandardJavaFileManager.class.getName(), "flush");
super.flush();
logger.exiting(StandardJavaFileManager.class.getName(), "flush");
           }
       };
compiler.getTask(null, fileManager, null, null, null, compilationUnits). call();
SimpleJavaFileObject
이 클래스는, 파일 객체를 작성할 때, 기본 단위로서 사용할 수 있는 기본 파일 객체 구현을 제공합니다. 예를 들어, 캐릭터 라인에 포함된 원시 코드를 나타내는 파일 객체를 정의하려면 , 다음과 같이 합니다.
       /**
* 캐릭터 라인에 포함된 소스를 나타내기 위해서(때문에) 사용하는 파일 객체.
*/
public class JavaSourceFromString extends SimpleJavaFileObject {
           /**
* 이 「파일」의 원시 코드.
*/
final String code;

           /**
* 새로운 JavaSourceFromString 를 구축.
* @param name 는 이 파일 객체로 나타내지는 컴파일 유니트의 이름
* @param code 는 이 파일 객체로 나타내지는 컴파일 유니트의 원시 코드
*/
JavaSourceFromString(String name, String code) {
super(URI.create ("string:///" + name.replace('. ', '/') + Kind.SOURCE.extension),
Kind.SOURCE);
this.code = code;
           }

@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
           }
       }

도입된 버젼:
1.6
관련 항목:
DiagnosticListener , Diagnostic , JavaFileManager

상자의 클래스의 개요
static interface JavaCompiler.CompilationTask
          컴파일 태스크의 장래를 나타내는 인터페이스입니다.
 
메소드의 개요
 StandardJavaFileManager getStandardFileManager (DiagnosticListener <? super JavaFileObject > diagnosticListener, Locale  locale, Charset  charset)
          이 툴의 표준 파일 관리자-구현의 새로운 인스턴스를 가져옵니다.
 JavaCompiler.CompilationTask getTask (Writer  out, JavaFileManager  fileManager, DiagnosticListener <? super JavaFileObject > diagnosticListener, Iterable <String > options, Iterable <String > classes, Iterable <? extends JavaFileObject > compilationUnits)
          지정의 컴퍼넌트 및 인수를 가지는 컴파일 태스크의 장래를 작성합니다.
 
인터페이스 javax.tools. Tool 로부터 상속된 메소드
getSourceVersions , run
 
인터페이스 javax.tools. OptionChecker 로부터 상속된 메소드
isSupportedOption
 

메소드의 상세

getTask

JavaCompiler.CompilationTask  getTask(Writer  out,
                                     JavaFileManager  fileManager,
                                     DiagnosticListener <?  super JavaFileObject > diagnosticListener,
                                     Iterable <String > options,
                                     Iterable <String > classes,
                                     Iterable <?  extends JavaFileObject > compilationUnits)
지정의 컴퍼넌트 및 인수를 가지는 컴파일 태스크의 장래를 작성합니다. 컴파일은, CompilationTask 인터페이스에 기술되고 있는 대로 행해지지 않을 가능성이 있습니다.

파일 관리자-가 지정되고 있는 경우,StandardLocation 에 정의 떠날 수 있어 모든 장소를 처리할 수 없으면 안됩니다.

파라미터:
out - 컴파일러로부터의 추가 출력에 사용하는 Writer. null 의 경우는 System.err 를 사용
fileManager - 파일 관리자-. null 의 경우는 컴파일러의 표준 파일 관리자-를 사용
diagnosticListener - 진단 청취자. null 의 경우, 컴파일러의 디폴트의 메소드를 사용해 진단 정보를 보고
options - 컴파일러 옵션. null 의 경우, 옵션은 존재하지 않는
classes - 클래스명 (주석 처리용). null 의 경우, 클래스명은 존재하지 않는
compilationUnits - 컴파일 대상의 컴파일 유니트. null 의 경우, 컴파일 유니트는 존재하지 않는다
반환값:
컴파일을 나타내는 객체
예외:
RuntimeException - 사용자 지정의 컴퍼넌트내에서, 회복 불가능한 에러가 발생했을 경우. cause 는 사용자 코드내의 에러
IllegalArgumentException - 소스와는 다른 종류의 컴파일 유니트가 지정되었을 경우

getStandardFileManager

StandardJavaFileManager  getStandardFileManager(DiagnosticListener <?  super JavaFileObject > diagnosticListener,
                                               Locale  locale,
                                               Charset  charset)
이 툴의 표준 파일 관리자-구현의 새로운 인스턴스를 가져옵니다. 파일 관리자-는, 치명적이지 않는 진단 정보의 생성에, 지정의 진단 청취자를 사용합니다. 치명적 에러가 발생했을 경우, 적절한 예외에 의해 통지됩니다.

표준 파일 관리자-는,flush 또는 close 의 호출의 나중에 액세스 되면(자), 자동적으로 재기동합니다. 표준 파일 관리자-는, 그 외의 툴로부터 이용할 수 없으면 안됩니다.

파라미터:
diagnosticListener - 치명적이지 않은 진단 정보용의 진단 청취자. null 의 경우, 컴파일러의 디폴트의 메소드를 사용해 진단 정보를 보고
locale - 진단 정보의 포맷시에 적용되는 로케일. null 의 경우,디폴트의 로케일이 적용되는
charset - 바이트의 디코드에 사용된 캐릭터 세트. null 의 경우, 플랫폼의 디폴트의 캐릭터 세트를 사용
반환값:
표준 파일 관리자-

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.