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 ?
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
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
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
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
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....
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
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
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" <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
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
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
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.
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
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é.
"sylvain.loiseau" <sylvain.loiseau@wanadoo.fr> a écrit dans le message de
news:bm9uuf$bqd$1@news-reader3.wanadoo.fr...
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é.
"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é.
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
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)
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
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
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
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
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
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" <sylvain.loiseau@wanadoo.fr> a écrit dans le message de
news:bm9uuf$bqd$1@news-reader3.wanadoo.fr...
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.
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
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.
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.
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.
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
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.
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.