JavaCompiler de JDK 1.6: cómo la clase de escritura de bytes directamente a byte [matriz]?

StackOverflow https://stackoverflow.com/questions/2130039

Pregunta

Así que aprendí recientemente de la nueva JavaCompiler API disponibles en el JDK 1.6. Esto hace que sea muy sencillo de compilar una String a un archivo .class directamente de la ejecución de código:

String className = "Foo";
String sourceCode = "...";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

List<JavaSourceFromString> unitsToCompile = new ArrayList<JavaSourceFromString>() 
    {{ 
         add(new JavaSourceFromString(className, sourceCode)); 
    }};

StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
compiler.getTask(null, fileManager, null, null, null, unitsToCompile).call();
fileManager.close();    

ByteArrayOutputStream bos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(className + ".class");
IOUtils.copyStream(fis, bos);

return bos.toByteArray();

Se puede obtener el código fuente a JavaSourceFromString de la Javadoc .

Esto sourceCode muy cómodamente compilación para Foo.class en el directorio de trabajo actual.

Mi pregunta es: : ¿es posible compilar directamente a una matriz byte[], y evitar el desorden de tratar con File de E / S por completo

¿Fue útil?

Solución

Tal vez usted podría crear su propia clase que implementa javax.tools.JavaFileManager donde le devuelva su propia implementación de javax.tools.FileObject que luego escribirlo en la memoria en lugar de disco. Así que para su subclase de método javax.tools.FileObject Writer openWriter() throws IOException que volvería una java.io.StringWriter. Todos los métodos se deben convertir a sus homólogos String.

Otros consejos

La razón de que no existe una API estándar para los códigos de bytes de escritura en una matriz de bytes es que la compilación de un solo archivo fuente de Java puede dar lugar a varios archivos de código de bytes. Por ejemplo, cualquier archivo fuente con clases anidadas / interno / anónimos resultará en varios archivos de código de bytes.

Si sacas tu propia JavaFileManager, tendrá que hacer frente a esta situación.

La aplicación de demostración que se envió con la API JSR 199 tenía un ejemplo en la memoria de compilación de cuerdas (que está hecho usando un MemoryFileManager). Tal vez echar un vistazo a él aquí o aquí (estas muestras son un poco anticuado, sin embargo, se requerirán cambios leves). También puede que compruebe el Cómo compilar sobre la marcha? artículo sobre Java.net.

PD: no se veía en todos los detalles, pero estoy no creo que se encarga de los casos mencionados por Stephen C .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top