2012-04-12 6 views
0

Я следую учебному курсу от Generating Java classes dynamically through Java compiler API, код работает, но то, что я вижу, будет создавать файл класса после его компиляции.Динамическая компиляция без создания физического файла

import java.io.IOException; 
import java.net.URI; 
import java.util.Arrays; 
import java.util.Locale; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.tools.JavaCompiler.CompilationTask; 
import javax.tools.*; 

public class Compiler { 

    static final Logger logger = Logger.getLogger(Compiler.class.getName()); 
    static String sourceCode = "class HelloWorld{" 
     + "public static void main (String args[]){" 
     + "System.out.println (\"Hello, dynamic compilation world!\");" 
     + "}" 
     + "}"; 

    public void doCompilation() { 

     SimpleJavaFileObject fileObject = new DynamicJavaSourceCodeObject("HelloWorld", sourceCode); 
     JavaFileObject javaFileObjects[] = new JavaFileObject[]{fileObject}; 

     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 

     StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, Locale.getDefault(), null); 

     Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(javaFileObjects); 

     DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>(); 

     CompilationTask compilerTask = compiler.getTask(null, stdFileManager, diagnostics, null, null, compilationUnits); 

     boolean status = compilerTask.call(); 

     if (!status) { 
      for (Diagnostic diagnostic : diagnostics.getDiagnostics()) { 
       System.out.format("Error on line %d in %s\n", diagnostic.getLineNumber(), diagnostic); 
      } 
     } 
     try { 
      stdFileManager.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(Compiler.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public static void main(String args[]) { 
     new Compiler().doCompilation(); 
    } 
} 

class DynamicJavaSourceCodeObject extends SimpleJavaFileObject { 

    private String qualifiedName; 
    private String sourceCode; 

    protected DynamicJavaSourceCodeObject(String name, String code) { 
     super(URI.create("string:///" + name.replaceAll("\\.", "/") + JavaFileObject.Kind.SOURCE.extension), JavaFileObject.Kind.SOURCE); 
     this.qualifiedName = name; 
     this.sourceCode = code; 
    } 

    @Override 
    public CharSequence getCharContent(boolean ignoreEncodingErrors) 
     throws IOException { 
     return sourceCode; 
    } 

    public String getQualifiedName() { 
     return qualifiedName; 
    } 

    public void setQualifiedName(String qualifiedName) { 
     this.qualifiedName = qualifiedName; 
    } 

    public String getSourceCode() { 
     return sourceCode; 
    } 

    public void setSourceCode(String sourceCode) { 
     this.sourceCode = sourceCode; 
    } 
} 

Возможно ли, что после вызова compilerTask.call();, чтобы не создавать файл класса? Если да, то как это сделать?

+0

Касается: http://stackoverflow.com/questions/616532/on-the-fly-in-memory -java-code-compilation-for-java-5-and-java-6 –

+0

Возможный дубликат [Как вы динамически компилируете и загружаете внешние классы Java?] (https://stackoverflow.com/questions/21544446/how- do-you-dynamically-compile-and-load-external-java-classes) – ldmtwo

ответ

4

Для чего я буду использовать Janino. Он выглядит выполнимым, используя только JavaCompiler, но недостаточно хорошо документирован. См. Комментарий, который я добавил связанный с withe вопрос, для примера об этом с помощью JavaCompiler.

EDIT: Я нашел простой для понимания example, используя JavaCompiler.

+0

Учебники работают, спасибо ... – Crazenezz

0

Чтобы избежать создания файла класса по JavaCompiler используют аргумент: «-proc: только»

 Смежные вопросы

  • Нет связанных вопросов^_^