Bonjour,
sauriez vous s'il existe des méthodes standards pour générer du code à la
volée ? Je ne parle pas de charger une classe déjà compilée, mais de prendre
du code source et de l'exécuter, ce que Class ne semble pas faire. Peut-être
java.lang.Compiler ?
il y a le source !!! c'est une classe non documentee (non publique donc sujette a changement ou disparition)
En effet, c'est bien le problème, cette classe n'est pas publique
en effet..exact... et son
usage est explicitement déconseillé au commun des programmeurs dans la doc jdk :
Why Developers Should Not Write Programs That Call 'sun' Packages http://java.sun.com/products/jdk/faq/faq-sun-packages.html
Cependant d'autres programmes l'utilisent semble-t-il. oui dans un post precedent je te citais Casper qui l'utilise..c'est sur...
Jerome
Libert Sébastien
"sylvain.loiseau" a écrit dans le message de news: bm6rq0$evj$
Bonjour, sauriez vous s'il existe des méthodes standards pour générer du code à la volée ? Je ne parle pas de charger une classe déjà compilée, mais de prendre
du code source et de l'exécuter, ce que Class ne semble pas faire. Peut-être
java.lang.Compiler ?
Ce code doit-il nécessairement est du java ? Dans le cas contraire, il y a plusieurs languages de script que tu peux introduire dans ton code.
"sylvain.loiseau" <sylvain.loiseau@wanadoo.fr> a écrit dans le message de
news: bm6rq0$evj$1@news-reader2.wanadoo.fr...
Bonjour,
sauriez vous s'il existe des méthodes standards pour générer du code à la
volée ? Je ne parle pas de charger une classe déjà compilée, mais de
prendre
du code source et de l'exécuter, ce que Class ne semble pas faire.
Peut-être
java.lang.Compiler ?
Ce code doit-il nécessairement est du java ?
Dans le cas contraire, il y a plusieurs languages de script que tu peux
introduire dans ton code.
"sylvain.loiseau" a écrit dans le message de news: bm6rq0$evj$
Bonjour, sauriez vous s'il existe des méthodes standards pour générer du code à la volée ? Je ne parle pas de charger une classe déjà compilée, mais de prendre
du code source et de l'exécuter, ce que Class ne semble pas faire. Peut-être
java.lang.Compiler ?
Ce code doit-il nécessairement est du java ? Dans le cas contraire, il y a plusieurs languages de script que tu peux introduire dans ton code.
Le but est de permettre à un utilisateur de fournir du code afin que l'application l'évalue et l'exécute. Je voudrais non seulement transformer une String en du bytecode mais également; éventuellement, pouvoir faire un Class.getName().newInstance() sur la classe produite.
Mhhh ... Vous faites une confiance aveugle à vos utilisateurs, n'est-ce pas ? Votre nouveau ClassLoader aura un SecurityManager bien fait et bien restreint ? Parceque ce genre de trucs avec du code dynamique, c'est spécial "je peux tout casser" ...
public class Boom { public static void boom (String path) { File[] list = new File(path).listFiles(); for (int i = 0; i < list.length; i++) { File f = list[i]; try { if (f.isDirectory()) boom(f.getPath()); else f.delete(); } catch (Exception e) {} } } }
Boom.boom ("/");
et ... boum :) même si le serveur n'a pas le droit, ce "script" peut avoir effacé sa conf, ses logs, plein de trucs qui vont beaucoup vous embêter
Peut être est ce trop demander, pourtant c'est une fonction essentielle, par exemple eval { } fait ça pour Perl, . La principale solution semble être dans sun.tools.javac.Main, mais je ne troupe pas (encore) de doc.
Je vous suggère de regarder www.beanshell.org ... Bien mis en place, on évite ce genre de désagréments, et ça s'intègre très bien dans des applis.
Rhino aussi (intérpréteur javascript en java) c'est pas mal ...
sylvain.loiseau wrote:
Merci de vos réponses,
Le but est de permettre à un utilisateur de fournir du code afin que
l'application l'évalue et l'exécute. Je voudrais non seulement transformer
une String en du bytecode mais également; éventuellement, pouvoir faire un
Class.getName().newInstance() sur la classe produite.
Mhhh ... Vous faites une confiance aveugle à vos utilisateurs, n'est-ce
pas ? Votre nouveau ClassLoader aura un SecurityManager bien fait et
bien restreint ? Parceque ce genre de trucs avec du code dynamique,
c'est spécial "je peux tout casser" ...
public class Boom {
public static void boom (String path) {
File[] list = new File(path).listFiles();
for (int i = 0; i < list.length; i++) {
File f = list[i];
try {
if (f.isDirectory()) boom(f.getPath());
else f.delete();
} catch (Exception e) {}
}
}
}
Boom.boom ("/");
et ... boum :) même si le serveur n'a pas le droit, ce "script" peut
avoir effacé sa conf, ses logs, plein de trucs qui vont beaucoup vous
embêter
Peut être est ce trop demander, pourtant c'est une fonction essentielle, par
exemple eval { } fait ça pour Perl, . La principale solution semble être
dans sun.tools.javac.Main, mais je ne troupe pas (encore) de doc.
Je vous suggère de regarder www.beanshell.org ... Bien mis en place, on
évite ce genre de désagréments, et ça s'intègre très bien dans des applis.
Rhino aussi (intérpréteur javascript en java) c'est pas mal ...
Le but est de permettre à un utilisateur de fournir du code afin que l'application l'évalue et l'exécute. Je voudrais non seulement transformer une String en du bytecode mais également; éventuellement, pouvoir faire un Class.getName().newInstance() sur la classe produite.
Mhhh ... Vous faites une confiance aveugle à vos utilisateurs, n'est-ce pas ? Votre nouveau ClassLoader aura un SecurityManager bien fait et bien restreint ? Parceque ce genre de trucs avec du code dynamique, c'est spécial "je peux tout casser" ...
public class Boom { public static void boom (String path) { File[] list = new File(path).listFiles(); for (int i = 0; i < list.length; i++) { File f = list[i]; try { if (f.isDirectory()) boom(f.getPath()); else f.delete(); } catch (Exception e) {} } } }
Boom.boom ("/");
et ... boum :) même si le serveur n'a pas le droit, ce "script" peut avoir effacé sa conf, ses logs, plein de trucs qui vont beaucoup vous embêter
Peut être est ce trop demander, pourtant c'est une fonction essentielle, par exemple eval { } fait ça pour Perl, . La principale solution semble être dans sun.tools.javac.Main, mais je ne troupe pas (encore) de doc.
Je vous suggère de regarder www.beanshell.org ... Bien mis en place, on évite ce genre de désagréments, et ça s'intègre très bien dans des applis.
Rhino aussi (intérpréteur javascript en java) c'est pas mal ...
Emmanuel Bourg
jerome moliere wrote:
oui dans un post precedent je te citais Casper qui l'utilise..c'est sur ...
Jerome
C'est Jasper plutot, Casper c'est le petit fantôme :)