Je suis conscient que par défaut Java n'a pas le soi-disant Ma question est la suivante: Qu'est-ce que le raisonnement solide derrière elle? Je veux dire, Google'ing cela revient simplement une quantité massive de données anciennes et de faux raisons - même s'il y a une réponse que je recherche, je ne peux pas le filtrer de personnes qui viennent de lancer des mots génériques. P> Je ne suis pas intéressé par des réponses qui me disent comment se déplacer. Je peux le faire moi-même: p> fichier et code Java: p> Ceci est équivalent à: p> eval code> (ce que je prononce comme "mal"). Cela ressemble à une mauvaise chose - sachant que vous n'avez pas quelque chose qui le fais tant d'autres. Mais même pire semble être notifié que vous ne pouvez pas em> l'avoir.
Cadre de script de haricot (BSF) h3>
sample.py code> (dans
py code> dossier) Contenu: p>
à l'aide de ponts conçus comme JLINK h3>
p>
runtime.getruntime (). Exec code> comme root li>
ul> p>
5 Réponses :
Parce que l'évaluation des expressions java arbitraires dépend du contexte de celui-ci, d'étendues variables, etc. p>
Si vous avez besoin d'une sorte d'expression variable, utilisez simplement le cadre de script et Badamm! Vous avez beaucoup de types d'évaluation d'expression différents. Il suffit de prendre un type comme JavaScript comme par défaut et il y a votre eval ()! p>
Entreprise comme Java est, vous n'êtes pas contraint d'un choix. P>
Vous pouvez mapper des variables prédéfinies qui seront utilisées dans les expressions d'évaluation.
En outre, cela ne veut pas dire que c'est complètement impossible. C'est juste grossièrement peu pratique. Sans parler de ce eval code> plus souvent que non nocif ou une solution de merde même dans des langues qui l'appuient.
"eval" n'est disponible que dans les langages de script, car il utilise le même interprète qui exécute le reste du code; Dans de telles langues, la fonctionnalité est libre et bien intégrée, comme dans l'environnement de script, il fait peu de différence si vous exécutez une chaîne ou une "vraie" fonction. P>
Dans les langages copilés, l'ajout de "eval" signifierait en regrouper tout le compilateur - qui défierait le but de la compilation. Aucun langage compilé que je connaisse (même dynamique, comme ActionsCrrip3) a Eval. P>
Incidemment, le moyen le plus simple d'être évalué dans Java est celui que vous avez oublié de mentionner: JRE 1.6 est livré avec JavaScript Engine, vous permet de déterminer n'importe quel JavaScript dans deux lignes de code. Vous pouvez même affirmer que la présumé de votre question est fausse. Java 1.6 groupements un évaluateur d'expression très avancé fort>. p>
Afaik, JRE ne vient pas avec un moteur JavaScript, certains fournisseurs de JRE incluent une version modifiée de Rhino, mais elle n'est pas nécessaire.
@Josefx, cela fait partie de l'API standard de 1,6.
"Pas de langue compilée que je connaisse a Eval" - Lisp.
@Pter Taylor qui n'est vrai que pour l'API de script, JavaScript n'est pas nécessaire. Voir (JSR 223 IPL.) java.sun.com/developer/technicalarticles/ J2SE / Bureau / Script Ing ____________ Certaines personnes ont déjà rencontré ce problème Stackoverflow.com/questions/4649519/jvm-Missing-rhino/.../a>
@FDreger, @Peter Taylor - Si vous parlez de Javax.el, je pense que vous êtes incorrect. C'est dans Java Ee, pas Java SE. (Au moins, c'est ce que Java SE 6 Javadocs disent.)
@Stephen C: Non, je ne veux pas dire el, je veux dire JavaScript.
@Josefx: Spécification JRE n'inclut pas le moteur JavaScript, mais le JRE standard comprend de toute façon.
Comme Daniel souligne, il y a au moins une limitation des solutions Eval-Solutions à Java. Le PHP Eval, par exemple, exécute le code comme s'il faisait partie de la méthode environnante avec un accès complet aux variables locales, cela n'est pas possible de faire en java standard. Sans cette fonctionnalité Eval Alternatives nécessite beaucoup plus de travail et de verbosité, ce qui les rend beaucoup moins attrayant pour les solutions "rapides" et "faciles".
Un exemple P> eval () code> fait principalement partie des langages interprétés où les noms des variables locales et la structure de code (Scopes) sont disponibles au moment de l'exécution, ce qui permet d'"insérer" nouveau code. Java Bytecode ne contient plus cette information laissant des alternatives Eval () Impossible de cartographier l'accès aux variables locales. (Remarque: je ignore les informations de débogage car aucun programme ne doit s'appuyer sur elle et ne peut pas être présent) p>
context.put("i",new Integer(0));
eval(context,"i = 1");
System.out.println(context.get("i"));
Je pense que vous avez déjà placé la solution à votre réponse - Bundle The BeanShell Jar avec votre application (ou un hall d'accueil pour qu'elle soit incluse dans le JRE parfois) et vous avez votre évaluateur d'expression Java. Il aura toujours besoin d'une liaison des variables d'entrée, cependant. P>
(qu'est-ce que je suis plus curieux de: Comment fonctionne de bobo d'un tel script / expression? Je ne veux pas que mes utilisateurs Web exécutent du code dangereux sur mon serveur.) p>
Mais même pire semble être notifié que vous ne pouvez pas l'avoir. p> blockQuote>
Je pense que vous êtes malentendu em> quoi (la plupart des) articles disent. Clairement, il y a beaucoup em> de faire une évaluation d'expression dans une application Java. Ils n'ont pas toujours été disponibles, mais d'au moins certains d'entre eux ont été autour depuis longtemps. P>
Je pense que ce que les gens essaient de dire, c'est que l'évaluation de l'expression n'est pas disponible comme natif (c'est-à-dire comme une partie intrinsèque de Java ou des bibliothèques standard) et qu'il est peu probable d'être ajouté em> pour un certain nombre de bonnes raisons. Par exemple: p>
- Native EVAL aurait des problèmes de sécurité importants s'il est utilisé au mauvais endroit. (Et cela fait pour d'autres langues; E.g. Vous ne devriez pas utiliser
eval code> dans JavaScript pour lire JSON car il peut s'agir d'un itinéraire pour injecter des choses mauvaises dans le navigateur de l'utilisateur.) LI>
- Native EVAL aurait des problèmes de performance significatifs comparés au code Java compilé. Nous parlons de 100 à 10 000 fois plus lents, en fonction des techniques de mise en œuvre et de la quantité de mise en cache des expressions d'évaluation «compilées». Li>
- Eval Native introduirait une pile entière de problèmes de fiabilité ... beaucoup comme surutilisation / mauvaise utilisation de la coulée de type et de la réflexion à. li>
- Native EVAL est "pas Java". Java est conçu pour être un langage de programmation principalement statique. LI> ul>
et bien sûr ... p>
- Il existe d'autres moyens de le faire, y compris toutes les approches de mise en œuvre que vous avez énumérées. La plate-forme Java SE n'est pas dans l'entreprise de fournir toutes les bibliothèques possibles que tout le monde pouvait éventuellement vouloir. (Les téléchargements JRE sont déjà assez gros.) Li> ul>
Pour ces raisons, et probablement d'autres aussi, les concepteurs de langue Java ont décidé de ne pas soutenir l'évaluation de l'expression de manière native en Java SE. (Malgré tout, un soutien d'expression l'a officiellement fabriqué dans Java EE; par exemple sous la forme de langage d'expression JSP. Les classes sont dans le
javax.el code> package ... ou
javax.servlet .jsp.el code> pour une version plus ancienne / obsolète.) p>
Qu'entendez-vous par eval? Voulez-vous dire prendre une équation de mathématiques à chaîne et le calculer? Ou voulez-vous faire preuve d'une ligne de chaîne que doit représenter une ligne de code et évaluer ce code dans l'exécution?
Conditions d'utilisation pour iCanhascheezburger.com interdit reproduisant leurs images. Image enlevée.