[Java 6]Récupérer la Class compilée avec JavaCompiler
Salut,
je viens d'essayer la nouvelle classe de Java 6 JavaCompiler mais je n'arrive pas à récupérer l'objet CLass du code compilé.
Voici mon code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| String code = "public class HelloWorld { public static void main(String[] args) {System.out.println(\"Hello World !\");}}";
List<JavaFileObject> compilationUnits = new ArrayList<JavaFileObject>(1);
compilationUnits.add(new JavaSourceFromString("HelloWorld", code));
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.getTask(null, null, null, null, null, compilationUnits).call();
try {
Class<?> c = Class.forName("HelloWorld");
Method m = c.getMethod("main", String[].class);
m.invoke(null);
} catch (SecurityException ex) {
ex.printStackTrace();
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (NoSuchMethodException ex) {
ex.printStackTrace();
} catch (InvocationTargetException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} |
le code de la classe JavaSourceFromString (dans la javadoc de la classe JavaCompiler)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import java.net.URI;
import javax.tools.JavaFileObject.Kind;
import javax.tools.SimpleJavaFileObject;
/**
* A file object used to represent source coming from a string.
*/
public class JavaSourceFromString extends SimpleJavaFileObject {
/**
* The source code of this "file".
*/
final String code;
/**
* Constructs a new JavaSourceFromString.
* @param name the name of the compilation unit represented by this file object
* @param code the source code for the compilation unit represented by this file object
*/
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;
}
} |
Quand j'exécute mon code j'obtiens l'erreur suivante
Citation:
java.lang.ClassNotFoundException: HelloWorld
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at dynamiccompilation.Main.main(Main.java:48)
qui correspond à la ligne
Code:
Class<?> c = Class.forName("HelloWorld");
Peut-être faut-il utiliser un ClassLoader particulier ?