Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

10 réponses

1 2
Avatar
Olivier Chafik
sylvain.loiseau wrote:

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


Il n'y a pas de méthode standard pour compiler à la volée ton code (nous ne
sommes pas en JavaScript). java.lang.Compiler ne te servira a priori jamais
(sauf si tu veux et sais dialoguer avec le "Compilateur" JIT, qui est un
plus un traducteur bytecode -> natif qu'un compilo).
Par contre, si ce type de fonction t'est capital, je te conseille de te
tourner vers des moteurs de script comme BeanShell
(http://www.beanshell.org/).
--
°¤oOo¤°livier

Avatar
jerome moliere
Olivier Chafik wrote:

sylvain.loiseau wrote:


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



Il n'y a pas de méthode standard pour compiler à la volée ton code (nous ne
sommes pas en JavaScript). java.lang.Compiler ne te servira a priori jamais
(sauf si tu veux et sais dialoguer avec le "Compilateur" JIT, qui est un
plus un traducteur bytecode -> natif qu'un compilo).
Par contre, si ce type de fonction t'est capital, je te conseille de te
tourner vers des moteurs de script comme BeanShell
(http://www.beanshell.org/).
désolé de prendre le contrepied mais je vais être plus modéré, en disant

oui et non (je ne suis pas normand pourtant )....
car la necessite de compiler du bytecode a la volee existe et ce pour
plein de raisons notamment le cas des JSP qui voient la transformation
automatique en code source Java (servlet) puis compilation...
donc tu peux regarder les sources de casper (moteur JSP de tomcat) et
tu trouveras utilisation des com.sun.tools.(je ne sais plus quoi) avec
un classe Compiler reposant sur la presence de javac (donc SDK requis et
non simple JRE)....
autrement tu peux la jouer brutale et regarder BCEL ou JavaAssist pour
generer du byte code from sratch (ou modifier du byte code) ce qui est
fait dans des servurs d'applis du type JBOSS....

Voilà j'espère avoir êté clair et complet
Jerome


Avatar
Salut,
1) simple :
new Runtime().exec("javac Myclass.java");

2) Oui compiler semble être fait pour çà, a essayer :
Compiler.CompileClasses("Myclass.java")
a vérifier :
_existance de la property system : "java.compiler" = Name of JIT
compiler to use

_peut être y aurra t il un blème de classpath... (dépendances de ta classe
+où compiler place la class ? )
si tu trouve peut être enrichir le classpath (dynamiquement ou pas...) pour
Class.forName()

tiens nous au courant...
--
François LE DORNER

"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 ?

Merci,
Sylvain




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

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.

Merci,
Sylvain
Avatar
xav14
"sylvain.loiseau" a écrit dans le message de
news:bm9uuf$bqd$
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.

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.

Merci,
Sylvain




Ce genre de fonctionnalités ne se trouvent (à ma connaissance) que dans les
langages de script et pas dans ceux de programmation, du fait qu'un script
est interprété.

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

oui, un classloader dedie (a toi) te permettra de le faire


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.
il y a le source !!!

c'est une classe non documentee (non publique donc sujette a changement
ou disparition)

Jerome

Avatar
Cédric Chabanois
Ce genre de fonctionnalités ne se trouvent (à ma connaissance) que dans les
langages de script et pas dans ceux de programmation, du fait qu'un script
est interprété.




Oui mais c'est également possible en Java. La preuve : Eclipse le fait.
Dans la perspective debug, dans display qd tu debug un prog java.
Maintenant c peut-être pas tout à fait du java mais un langage de script
qui y ressemble.

Qq pistes :
- voir BSF (http://www-124.ibm.com/developerworks/projects/bsf)
- voir ant et ses taches : javac, script ...
- voir les sources de Eclipse si tu en as le courage

Cédric

Avatar
Salut,

Alors ma solution ne te plais pas ?
Compiler.CompileClasses("Myclass.java")
-->tu peux faire un template pour générer ton .java
(ton code dans une String peut être mit sans une méthode
de ton template.)
-->CompileClasses te permet de savoir si ton code est correctement compilé
-->tu obtiens une classe
-->donc tu peux faire un newInstance

C'est pas sorcier ...

--
François LE DORNER.


"sylvain.loiseau" a écrit dans le message de
news:bm9uuf$bqd$
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.

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.

Merci,
Sylvain




Avatar
sylvain.loiseau
Alors ma solution ne te plais pas ?
Compiler.CompileClasses("Myclass.java")
-->tu peux faire un template pour générer ton .java
(ton code dans une String peut être mit sans une méthode
de ton template.)
-->CompileClasses te permet de savoir si ton code est correctement compilé
-->tu obtiens une classe
-->donc tu peux faire un newInstance

C'est pas sorcier ...


J'ai l'impression (c'est ce que disais quelqu'un plus haut et ce que je
comprends de la doc) que java.lang.Compiler est un accès à un compilateur
bytecode ->code machine plutôt que code-source-java->bytecode.

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

Sylvain

1 2