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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
Class<?> c = Class.forName("HelloWorld");
Peut-être faut-il utiliser un ClassLoader particulier ?