2016-08-31 4 views
1

javaCompiler를 사용하여 동적으로 Java 코드를 컴파일하려고합니다. 코드가 작동하지만 CompilationTask에서 만든 클래스 파일 목록을 가져와야합니다. 여기에 소스 코드가 있습니다 :JavaCompiler 컴파일로 생성 된 클래스 파일 목록을 가져 오는 방법은 무엇입니까?

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
    StandardJavaFileManager fileManager = compiler.getStandardFileManager (diagnostics,null,null); 
    //compile unit 
    Iterable<? extends JavaFileObject> compilationUnits =fileManager.getJavaFileObjectsFromFiles (sourceFileList); 
    CompilationTask task = compiler.getTask (null,fileManager, diagnostics, null, null, compilationUnits); 
    task.call(); 

내부 클래스를 포함하여 위의 코드에 의해 생성 된 클래스 목록을 어떻게 얻을 수 있습니까? 어떤 도움을 많이 주시면 감사하겠습니다.

+0

을 생성 A.classA$B.class의 위치를 ​​나열합니다 ... – Holger

답변

2

당신이 작업에 제공하는 파일 관리자로 모든 파일을 얻을 -d 옵션을 사용하여 클래스 파일에 대한 대상 디렉토리를 설정, 실제 파일에 추상 JavaFileObject의 매핑에 대한 책임 , 따라서 은 어떤 리소스가 액세스되거나 생성되는지을 알 수있을뿐만 아니라 컨트롤 실제 리소스가 사용됩니다. 물론, 처리 된 후에 생성 된 자원을 찾는 것 또한 가능합니다. 다음은 간단한 자체에 포함 된 예는 다음과 같습니다

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null,null); 
Path tmp=Files.createTempDirectory("compile-test-"); 
fileManager.setLocation(StandardLocation.CLASS_OUTPUT,Collections.singleton(tmp.toFile())); 
Path src=tmp.resolve("A.java"); 
Files.write(src, Arrays.asList(
     "package test;", 
     "class A {", 
     " class B {", 
     " }", 
     "}" 
)); 
CompilationTask task = compiler.getTask(null, fileManager, 
     null, null, null, fileManager.getJavaFileObjects(src.toFile())); 
if(task.call()) { 
    for(JavaFileObject jfo: fileManager.list(StandardLocation.CLASS_OUTPUT, 
          "", Collections.singleton(JavaFileObject.Kind.CLASS), true)) { 
     System.out.println(jfo.getName()); 
    } 
} 

그것은 아마 모든 자원이 제공하는 파일 관리자를 통해 액세스되는 것을 고려하는 데 도움이 ...

+0

감사합니다! ! 이게 내가 찾고 있던거야. – sun2

0

javax.tools.JavaCompiler#getTask() 메서드는 컴파일러 옵션을 설정할 수있는 options 매개 변수를 사용합니다.

이제
List<String> options = new ArrayList<String>(); 
// Sets the destination directory for class files 
options.addAll(Arrays.asList("-d","/home/myclasses")); 

CompilationTask task = compiler.getTask (null,fileManager, diagnostics, options, null, compilationUnits); 

.class 확장명