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

Java Discussion :

Réutiliser une fonction par laquelle on est passer


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut Réutiliser une fonction par laquelle on est passer
    Bonjour,

    J'aimerais réaliser une fonction qui fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typeRetour Ma fonction(type1 arg1,type2 arg2)
    {
       //traitement
       memoire.nom=getLeNomDeLaFonctionQueJUtilise();
       memoire.parametres=getLesParametresDeLaFonctionQueJUtilise();
       //retour
    }
     
    void Execution()
    {
      memoire.parametres[0]=nouveauParametre; //on change le premier paramètre
      executer(<memoire.nom>(<memoire.parametres>) );
    }
    J'espère que ce pseudo code est assez parlant. La question est est-ce que c'est possible ?

  2. #2
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    Je ne suis pas sûr d'avoir compris, mais pour moi, ce que décris là est proche d'un comportement d'interface..

    On se fiche de savoir ce que l'objet fait, on sait juste qu'il existe tel méthode, qui prend tels arguments et renvois tel type (après, ce qu'elle fait et comment elle le fait... on s'en fiche)..

    Je ne sais pas si je suis à côté, mais sinon, à part utiliser un tableau de pointeur de fonctions (solution à éviter en courant), je ne vois pas ce que tu veux faire..

    (je réitère, pour moi, ta conception est mauvaise mais laisse transparaitre l'idée d'interface..)

  3. #3
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    On peut effectivement passer par une ou plusieurs interfaces.
    Maintenant, tout dépend du besoin réel : si on veut être plus généraliste, on peut passer par la réflexivité, cela donne qq chose comme ça (tous les paramètres sont supposés de type String)
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    class Evaluator<T> {
     
    	protected List<String> parametres = new ArrayList<String>();
     
    	public void addParametre(int index, String element) {
    		parametres.add(index, element);
    	}
     
    	public boolean addParametre(String o) {
    		return parametres.add(o);
    	}
     
    	public String removeParametre(int index) {
    		return parametres.remove(index);
    	}
     
    	@SuppressWarnings("unchecked")
    	public T eval(Object target, String methodName) {
    		Class[] types = new Class[parametres.size()];
    		for (int i = 0; i < types.length; i++) {
    			types[i] = String.class;
    		}
     
    		try {
    			Method m = target.getClass().getDeclaredMethod(methodName, types);
    			return (T) m.invoke(target, parametres.toArray());
    		} catch (SecurityException e) {
    			e.printStackTrace();
    		} catch (NoSuchMethodException e) {
    			e.printStackTrace();
    		} catch (IllegalArgumentException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Merci pour l'info c'est effectivement de reflexivité que j'ai besoin (je ne savais pas que ça existait mais j'ai appris).
    Il y a juste un detail sur lequel je bute, je sais créer une variable Method mais comment faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class monObjet
    {
      void maMethode(String monParametre)
      {
         Method methodeEnCours=getLaMethodeQuiSExecuteEnCeMoment(); //ici "maMethode", si j'ai son nom ça me va aussi
         Object[] parametres=getLesParametresDeCetteMethode();
      }
    }
    Si je demande ça s'est parce que j'ai une centaine de méthode où je devrais mettre ça et si ça pouvait se faire automatiquement ça serais assez cool

  5. #5
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Récupérer le nom de la méthode est possible en levant une exception et en consultant la stack trace. Par contre, pour les paramètres, je n'en ai aucune idée.
    Sinon, il est possible de scanner la classe à la recherche des méthodes pour en déduire les types des paramètres.
    Quel est le besoin exact ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Je souhaite en fait enregistrer les noms et paramètres de manière à pouvoir rappeler la fonction par laquelle je suis passé (sachant qu'il y a un grand nombre de fonctions par lesquelles on peut passer et que toutes on des paramètres différents).

    Le but c'est d'actualiser les données et leur interprétation par la fonction choisie par l'utilisateur puis de les afficher sur un graphique

    Mais je crois que je suis bon pour mettre manuellement tous les noms et tableaux d'arguments dans des variables mémoire

  7. #7
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Quand tu dis
    Je souhaite en fait enregistrer les noms et paramètres
    il s'agit des valeurs des paramètres ou des types des paramètres ?
    Tu veux pouvoir rappeler la méthode avec les mêmes valeurs que lors du 1er appel, c'est bien ça ?

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 23/01/2010, 11h04
  2. Réponses: 7
    Dernier message: 15/02/2009, 23h01
  3. passer une fonction en argument, c'est possible ?
    Par kamouminator dans le forum C
    Réponses: 4
    Dernier message: 10/11/2006, 21h13
  4. creation d'une fonction par l'utilisateur
    Par michelk dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 15/03/2005, 09h53
  5. [Reflection] Executer une fonction dont le nom est contenu dans un String
    Par christobal dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/07/2004, 15h23

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