IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[Système][info] beanshell


Sujet :

API standards et tierces Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 38
    Par défaut [Système][info] beanshell
    Bonjour,

    je ne connais pas beanshell et j'aimerai savoir si avec beanshell tu peux définir une grammaire et des mots clés.

    Est il possible aussi de lui fournir en entrée une chaine de caractère (un string) et qu'il nous rende le code qui a été interpréter (peut-être sous la forme d'un string)

    merci.

  2. #2
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Bonjour,
    Beanshell interprete directement la langage Java. Il n'est pas fais pour générer une grammaire ou interpréter un autre langage. Il ne renvoie pas de code mais interprete celui que tu lui passe en paramètre et après tu peux récupérer les objets qu'il a modifié/créé.
    Tu peux aussi lui passer en paramètre les objets de ton code Java.

    Exemple :

    Voici un fichier Java qui utilise un script beanShell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    import bsh.Interpreter;
     
    public class DemoBsh{
     
    	public static void main(String[] args){
    		Interpreter bsh = new Interpreter();
    		String str = "test";
     
    		if(args.length > 0){
    			str = args[0];
    		}
    		try{
    		bsh.eval("importCommands(\"/bshCommands\");"); // Je charge le fichier de script qui se trouve dans le sous-répertoire bshCommands (le répertoire courant étant dans le CLASSPATH)
     
    		bsh.set("chaine", str); // Je passe en paramètre à beanshell un objet que j'ai créé
    		bsh.eval("d = Demo(chaine);");
    		bsh.eval("result = d.traitement();"); 
    		String res = (String)bsh.get("result"); // Je récupère un objet créé par beanshell
     
     
    		System.out.println("La chaine après le traitement : ->"+res);
    		}
    		catch(Exception e){
    			System.err.println("Une erreur beanShell : "+e);
    		}
     
     
    	}
     
    }
    Le script beanShell. Je peux modifier par exemple la méthode traitement() sans n'avoir rien à recompiler. Ce script se trouve dans le fichier Demo.bsh dans le sous répertoire bshCommands :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Demo(String s){
    	String laChaine = s;
     
    	public String traitement(){
    		s = "";
    		for(i=0; i<5; i++){
    			s += this.laChaine;
    		}
    		return s;
    	}
    	return this;
    }
    pour tester l'exemple tu dois avoir :

    rep/DemoBsh.java
    rep/bsh-2.0b1.jar
    rep/bshCommands/Demo.bsh

    tu compile : javac -classpath bsh-2.0b1.jar;. DemoBsh.java
    et tu lance : java -cp bsh-2.0b1.jar;. DemoBsh uneChaine

    Pour l'instant ma méthode traitement() ne fais que concaténer 5 fois la chaine de caractère passée en paramètre. Mais tu peux la modifié pour tester d'autres code.....


    Regarde bien aussi le premier exemple (le cadre gris), il est assez parlant :
    http://www.beanshell.org/manual/embeddedmode.html#Embedding_BeanShell_in_Your_Application

    Donc pour répondre à ta question, tu ne peux pas redéfinr de mot clef avec beanShell, mais tu peux définir un nouveau jeux de fonctions.
    Regarde l'exemple que j'ai mis dans ce thread :
    http://www.developpez.net/forums/vie...light=#1095904
    J'ai créé deux fonctions chiffre() et decimal() qui permettent à l'utilisateur de transformer un String en int ou double sans avoir à connaitre le code java Interger.parseInt() et autre.
    Donc tu peux créé un jeux de fonctions personnalisées que l'utilisteur (celui qui créé les scripts ou une partie), connaitra. Ce sera les mots clef de ton 'langage', même si derrière se cache du java.

    voilou

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 38
    Par défaut
    merci beaucoup ca à l'air puissant.

    je suppose qu'il faut compter un certain temps d' interpretation comme tout interpréteur?

  4. #4
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Le peux que j'ai tester il a l'aire assez performant. Mais c'est sure que je ne l'utiliserais pas pour de très gros traitement...
    Mais franchement je te conseille de lire la doc, elle est pas compliqué, et elle montre bien tout ce qu'on peut faire (ie à peu près tout )
    voilou

    [EDIT]
    Ou alors les gros traitements je les met dans une class java normal que je compile, je passe une instance de cette classe à beanshell, et c'est beanshell qui s'occupe de lancé le traitement. Dans ce cas là, il n'y a pas de perte de performance car il exécute directement la méthode compilé en java. Donc tu peux faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    Traite t = new Traite();
    bsh.set("t", t); // J'intègre une instance de traitement dans beanShell
    bsh.eval("traitement(){super.t.longTraitement();}"); // je cré une fonction qui lancera lelong traitement
    bsh.eval("traitement();");  // Je lance le traitement avec ma fonction beanshell
    Dans ce cas il ne doit pas y avoir de perte de performance car beanshell ne va interprété le traitement vu qu'il fait parti d'une clase compilée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [D7][Infos système] Comment lister toutes les classes WMI ?
    Par phplive dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 03/05/2006, 23h51
  2. Réponses: 3
    Dernier message: 27/04/2006, 14h23
  3. [Infos Système] Version d'Access
    Par Dolphy35 dans le forum Access
    Réponses: 1
    Dernier message: 08/12/2005, 21h16
  4. [Infos Système] Récuperer les infos système
    Par Dolphy35 dans le forum Access
    Réponses: 3
    Dernier message: 07/12/2005, 21h20
  5. Infos systèmes
    Par fo comlan dans le forum Général Python
    Réponses: 1
    Dernier message: 22/11/2005, 20h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo