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 codele 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 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(); }Quand j'exécute mon code j'obtiens l'erreur suivante
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; } }qui correspond à la lignejava.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)Peut-être faut-il utiliser un ClassLoader particulier ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Class<?> c = Class.forName("HelloWorld");
Partager