Bonjour, je sais qu'il existe déjà énormément de topics là-dessus, mais rien ne marche

- Mon application permet d'intégrer du fichier source utilisateur via un javax.tools.JavaCompiler. Tout se passe bien, la classe est compilé et prête en mémoire. Mais il faudrait enregistrer le bytecode généré dans un fichier .class, et je ne trouve le moyen ni dans la documentation ni sur les forums.

- Après, il faudrait recharger dynamiquement la classe compilée qui se trouve dans un répertoire totalement différent de celui de l'application. Je précise que ce fichier ne se trouve pas dans un JAR, et ne possède pas de package.

J'aimerais savoir s'il est possible de charger dynamiquement cette classe dans le package de l'application juste en ayant son chemin?

Voilà le code qui permet d'enregistrer une classe via son nom et son code source, qui marche parfaitement, mais ne permet pas d'enregistrer la classe dans un .class:

Code java : 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
 
public static Class compileClass(String className, String sourceCode)
{
	JavaCompiler javacompiler = ToolProvider.getSystemJavaCompiler();
 
	Iterable<? extends JavaFileObject> fileObjects = getJavaSourceFromString(className, sourceCode);
 
	SC_JavaFileManager javaFileManager = new SC_JavaFileManager(javacompiler.getStandardFileManager(null, null, null));
	javacompiler.getTask(null, javaFileManager, null, null, null, fileObjects).call();
 
	try
	{
		return Class.forName(className, true, javaFileManager.thisClassLoader);
	}
	catch(ClassNotFoundException e)
	{
		e.printStackTrace();
	}
 
	return null;
}

Je posterais le code sources de classes SC_JavaFileManager et SC_JavaFileObject si nécessaire.


Voilà le code du chargeur de classe, qui lui ne marche pas:

Code JAVA : 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
30
31
32
33
public static Class<?> addClass(File file)
{
	if(!file.getName().endsWith(".class"))
	{
		throw new IllegalArgumentException("Le fichier à ajouter n'est pas un fichier .class!");
	}
 
	ClassLoader classLoader = SC_CompilerAndLoader.class.getClassLoader();
 
	try
	{
		method_addURL.invoke(classLoader, new Object[]
				{
					file.toURI().toURL()
				});
 
		String className = file.getName().split("\\.")[0];
 
		if(className.contains("$"))
		{
			return null;
		}
 
		Class c = classLoader.loadClass(new StringBuilder().append(SC_CompilerAndLoader.getPackage().getName()).append(".").append(className).toString());
		SC_Utils.info("Classe chargée:" + className);
		return c;
	}
	catch(Exception e)
	{
		e.printStackTrace();
		throw new NullPointerException();
	}
}


Merci