OVH Cloud OVH Cloud

Génération de bytecode à la volée

14 réponses
Avatar
sylvain.loiseau
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 ?

Merci,
Sylvain

4 réponses

1 2
Avatar
jerome moliere
sylvain.loiseau wrote:
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


Avatar
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.

Tu en trouveras une liste ici :

http://pharos.inria.fr/Java/query.jsp?cids=c_2205&hist=text%3Dscript

ou ici :

http://www.javaworld.com/javaworld/jw-04-2002/jw-0405-scripts.html?



HTH
Sébastien Libert.

Avatar
Erwan Arzur
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 ...

Avatar
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 :)

http://cvs.apache.org/viewcvs.cgi/*checkout*/jakarta-tomcat-4.0/jasper/sr c/share/org/apache/jasper/compiler/SunJavaCompiler.java

Emmanuel

1 2