Y a t il une fonction eval() en Java?
J'ai une chaîne de caractères comme suit:
String str = "4*5";
Maintenant, je dois obtenir le résultat de 20
par l'aide de la chaîne.
Je sais que dans certaines autres langues de la eval()
fonction de ce faire.
Comment puis-je le faire en Java?
- Je vous suggère d'oublier Java pour cette tâche et l'utilisation Clojure. Clojure permet d'analyser et/ou de compiler le code au moment de l'exécution (et au moment de la compilation) et l'exécuter, et également de générer le code au moment de la compilation ainsi que beaucoup d'autres choses qui sont, par ailleurs, assez habituel dans le monde LISP. Java est trop ennuyeux. Et Clojure pouvez faire tout ce que Java peut, parce qu'il tourne sur la JVM (bien que les autres implémentations existent, trop) Et il peut être mélangé avec Java de façon transparente, même à l'intérieur d'un projet partagé.
- Ce n'est pas un doublon d'une question demandant aux comment évaluer une expression arithmétique car il en fait la demande, à propos de la fonction eval().
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
ScriptEngine
de la classe et de l'évaluer comme un Javascript chaîne.Il peut y avoir une meilleure façon, mais celui-ci fonctionne.
while(true){ 3+4;}
et accrocher votre JVM.testCompile group: 'org.apache.bsf', name: 'bsf-all', version: '3.0-beta3'
. Sourcethrows exception
dans la fonction avant de l'utiliser que .Il n'existe pas de standard de Java une classe ou une méthode qui permettra de faire ce que vous voulez. Vos options comprennent:
Sélectionner et d'utiliser certaines de tiers l'évaluation de l'expression de la bibliothèque. Par exemple JEL ou de l'une de la demi-douzaine de bibliothèques répertoriées ici.
Placer l'expression dans le code source Java pour une classe avec un
eval
méthode, envoyer que pour le compilateur de Java, puis de charger la résultante classe compilée.Utiliser certains langage de script qui peut être appelée à partir de Java comme un évaluateur d'expression. Les possibilités incluent Javascript, BeanShell, et ainsi de suite.
Écrire votre propre évaluateur d'expression à partir de zéro.
La première approche est sans doute plus simple. Les deuxième et troisième approches sont un risque de sécurité potentiel si vous obtenez l'évaluation de l'expression d'un utilisateur non fiable. (Pensez à l'injection de code.)
Il y a très peu de vrais cas d'utilisation dans lequel être en mesure d'évaluer un
String
comme un fragment de code Java est nécessaire ou souhaitable. C'est, demandant comment faire c'est vraiment un XY problème: en fait, vous avez un autre problème, qui peut être résolu d'une manière différente.D'abord vous demander, d'où vient cette
String
que vous souhaitez évaluer viennent? A une autre partie de votre programme de production, ou était-ce l'entrée fournie par l'utilisateur?Une autre partie de mon programme généré: donc, vous voulez une partie de votre programme de décider le type d'opération à effectuer, mais de ne pas effectuer l'opération, et une deuxième partie qui effectue l'opération choisie. Au lieu de générer puis de l'évaluation d'un
String
, utilisez le Stratégie, Commande ou Constructeur modèle de conception, en fonction de votre cas particulier.Elle est saisie de l'utilisateur: l'utilisateur pourrait entrer rien, y compris les commandes qui, lorsqu'il est exécuté, pourrait causer votre programme à mal se conduire, de planter, d'exposer des informations qui doivent être secret, des dommages persistants de l'information (telles que le contenu d'une base de données), et d'autres de telles ignominies. La seule façon de prévenir qui serait à analyser les
String
vous-même, vérifiez qu'il n'était pas méchant, et puis de l'évaluer. Mais l'analyse elle-même est une grande partie du travail que la demande deeval
fonction, de sorte que vous avez enregistré vous-même rien. Pire encore, en vérifiant que l'arbitraireJava
n'était pas malveillant est impossible, car le contrôle qui est le problème de l'arrêt.Elle est saisie de l'utilisateur, mais la syntaxe et la sémantique de permis de texte pour évaluer limite considérablement les: Pas de fins générales de l'établissement peut facilement mettre en œuvre un objectif général de l'analyseur et l'évaluateur quelle que soit limitée la syntaxe et de la sémantique que vous avez choisi. Ce que vous devez faire est de mettre en œuvre un analyseur et d'évaluateur pour votre choix de la syntaxe et de la sémantique. Si la tâche est simple, vous pourriez écrire une simple récursive de la descente ou finis de machine d'état de l'analyseur à la main. Si la tâche est difficile, vous pouvez utiliser un le compilateur de compilateur (comme ANTLR) pour faire le travail pour vous.
Je veux juste mettre en œuvre une calculatrice de bureau!: Un devoir à la maison, hein? Si vous pouviez mettre en œuvre l'évaluation de l'expression d'entrée à l'aide d'une condition
eval
fonction, il ne serait pas beaucoup de devoir à la maison, ne serait-il? Votre programme devrait être de trois lignes. Votre instructeur probablement attend de vous d'écrire le code d'une arithmétique simple analyseur/évaluateur. Il est bien connu de l'algorithme, shunting-yard, qui pourrait vous être utile.Je pourrais vous conseiller d'utiliser Exp4j. Il est facile de comprendre comme vous pouvez le voir à partir de l'exemple de code suivant:
Avec Java 9, nous avons accès à
jshell
, donc on peut écrire quelque chose comme ceci:Exemple d'exécution:
Légèrement OP, mais c'est ce que Java actuellement a à offrir
Comme les réponses précédentes, il n'y a pas de norme API en Java pour cela.
Vous pouvez ajouter groovy fichiers jar de votre chemin et groovy.util.Eval.moi("4*5") obtient la réalisation de votre travail.
ScriptEngine
.Pas, vous ne pouvez pas avoir un générique de "eval" en Java (ou de tout langage compilé). Sauf si vous êtes prêt à écrire un compilateur Java ET la JVM pour être exécuté à l'intérieur de votre programme Java.
Oui, vous pouvez avoir une bibliothèque pour évaluer numérique expressions algébriques comme ci-dessus - voir ce fil de discussion.
De la rédaction de votre propre bibliothèque n'est pas si difficile que peut-être u chose. Voici le lien pour Shunting-yard algorithme avec étape par étape de l'algorithme explenation. Bien, vous allez avoir à analyser les données d'entrée pour les jetons d'abord.
Il ya 2 autres questions qui peuvent vous donner quelques informations:
Transformer une Chaîne de caractères dans une Expression Mathématique?
Ce qui est une bonne bibliothèque pour l'analyse des expressions mathématiques en java?
Comme il y a beaucoup de réponses, je vais ajouter mon application sur le dessus de
eval()
méthode avec quelques fonctionnalités supplémentaires comme le support des factoriel, l'évaluation des expressions complexes etc.Veuillez trouver les mises à jour de gist à tout moment ici. Aussi commentaire si tous les problèmes sont là. Merci.
Il n'y a rien qui va le faire en JavaSE; vous devez trouver les bibliothèques de tiers ou écrire votre propre.