G
Gast123
Gast
Hallo,
hier http://www.tutego.com/java/articles/Java-Compiler-API.html habe ich ein Demo gefunden, bei der man eine Klasse zur Laufzeit compilieren kann, die noch nichtmal in einer Datei sondern in einem String ist!
Code-Zitat obiger URL:
Nur leider bekomme ich beim Aufruf die Exception "Class B not found!".
Ich glaube, dass bei dem class.forname("B"); noch vielleicht ein ClassLoader fehlt, denn compilieren scheint er es, da bei absichtlichen Syntaxfehlern in src es zu Compiler-Exceptions kommt.
Was müsste man ändern, damit es läuft?
Vielen Dank!
Jawas.[/code]
hier http://www.tutego.com/java/articles/Java-Compiler-API.html habe ich ein Demo gefunden, bei der man eine Klasse zur Laufzeit compilieren kann, die noch nichtmal in einer Datei sondern in einem String ist!
Code-Zitat obiger URL:
Code:
package com.tutego.insel.tools;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;
import java.util.List;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;
public class CompileDemo
{
public static void main( String[] args ) throws Exception
{
Writer p = new FileWriter( "c:/A.java" );
p.write( "class A { static { System.out.println(\"Java Compiler API\"); } }" );
p.close();
//
JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager manager = tool.getStandardFileManager( null, null, null );
List<File> fileList = Arrays.asList( new File("c:/A.java") );
Iterable<? extends JavaFileObject> units;
units = manager.getJavaFileObjectsFromFiles( fileList );
CompilationTask task = tool.getTask( null, manager, null, null, null, units );
task.call();
String src = "class B { static { System.out.println(\"Aus der Ursuppe\"); } }";
JavaFileObject javaFile = new JavaSourceFromString( "B", src );
units = Arrays.asList( javaFile );
task = tool.getTask( null, manager, null, null, null, units );
task.call();
manager.close();
//
URLClassLoader classLoader = new URLClassLoader(
new URL[] { new File( "c:/" ).toURI().toURL() } );
Class.forName( "A", true, classLoader ); // Java Compiler API
Class.forName( "B" ); // Aus der Ursuppe
}
}
class JavaSourceFromString extends SimpleJavaFileObject
{
private final String code;
public 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;
}
}
Nur leider bekomme ich beim Aufruf die Exception "Class B not found!".
Ich glaube, dass bei dem class.forname("B"); noch vielleicht ein ClassLoader fehlt, denn compilieren scheint er es, da bei absichtlichen Syntaxfehlern in src es zu Compiler-Exceptions kommt.
Was müsste man ändern, damit es läuft?
Vielen Dank!
Jawas.[/code]