2012-05-03 2 views
1

Я попытался найти способ скомпилировать класс на лету, и у меня есть, как создать скомпилированный экземпляр класса. Однако я хочу, чтобы создать исполняемый файл .class. Как я, если возможно, смогу вывести объект Class в файл .class. Если это неверно, объясните, как я смогу это сделать.Как напечатать объект java.lang.Class в файл?

+1

вы можете быть немного ясно, я извиняюсь, но я не понимаю, вопрос – Satya

+1

Что вы на самом деле подразумевают под «создать файл класса, который является исполняемым»? ОС не запускается непосредственно из файлов классов - запускается JVM, а затем вызывает основной метод для данного класса. –

+0

Файлы классов уже исполняются с помощью команды 'java'. Какова ваша проблема? Ввод этой длинной команды 'java' каждый раз? Просто создайте файл '.bat' или' .sh', в который вы введете эту полную команду. – BalusC

ответ

0

Нельзя. Вместо этого сделайте исполняемую банку.

Есть другие варианты, как указано here, если вы чувствуете, и исполняемый фляга не то, что вам нужно.

0

Эта страница http://www.accordess.com/wpblog/an-overview-of-java-compilation-api-jsr-199/ описывает процесс компиляции Java-кода из строки, создавая файл .class. Ниже приведена сокращенная версия кода, прокомментированного иначе.

public class CompilerAPITest { 
    final Logger logger = Logger.getLogger(CompilerAPITest.class.getName()) ; 

    /** Java source code to be compiled dynamically */ 
    static String sourceCode = "package com.accordess.ca;" + 
     "class DynamicCompilationHelloWorld{" + 
      "public static void main (String args[]){" + 
       "System.out.println (\"Hello, dynamic compilation world!\");" + 
      "}" + 
     "}" ; 

    /* Object initialization and compilation. */ 
    public void doCompilation(){ 
     SimpleJavaFileObject fileObject = new DynamicJavaSourceCodeObject ("com.accordess.ca.DynamicCompilationHelloWorld", 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); 
     //This example places the output files under bin folder. 
     String[] compileOptions = new String[]{"-d", "bin"} ; 
     Iterable<String> compilationOptions = Arrays.asList(compileOptions); 
     DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
     CompilationTask compilerTask = compiler.getTask(null, stdFileManager, diagnostics, compilationOptions, null, compilationUnits) ; 
     boolean status = compilerTask.call(); 
     if (!status){//If compilation error occurs 
      for (Diagnostic diagnostic : diagnostics.getDiagnostics()){ 
       System.out.format("Error on line %d in %s", diagnostic.getLineNumber(), diagnostic); 
      } 
     } 
     try { 
      stdFileManager.close() ;//Close the file manager 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    public static void main(String args[]){ 
     new CompilerAPITest().doCompilation() ; 
    } 
} 

class DynamicJavaSourceCodeObject extends SimpleJavaFileObject{ 
    private String qualifiedName ; 
    private String sourceCode ; 

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

    @Override 
    public CharSequence getCharContent(boolean ignoreEncodingErrors) 
      throws IOException { 
     return sourceCode ; 
    } 
    // ... getters and setters 
} 
Смежные вопросы