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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    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 éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    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 expérimenté 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
    Points : 1 608
    Points
    1 608
    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 régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    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 expérimenté 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
    Points : 1 608
    Points
    1 608
    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 régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    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 expérimenté 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
    Points : 1 608
    Points
    1 608
    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 ?

  8. #8
    Membre expérimenté 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
    Points : 1 608
    Points
    1 608
    Par défaut
    Peut-être qq chose comme ça :
    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
    	abstract class Recallable<T> {
     
    		private boolean recording = true;
    		private String[] args;
     
    		public final T call(String... args) {
    			if (recording) {
    				this.args = args;
    			}
    			return f(args);
    		}
     
    		public final T recall() {
    			if (args == null) {
    				throw new IllegalStateException("aucun appel mémorisé");
    			}
    			return f(args);
    		}
     
    		public boolean isRecording() {
    			return recording;
    		}
     
    		public void setRecording(boolean recording) {
    			this.recording = recording;
    		}
     
    		protected abstract T f(String... args);
    	}

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    Non pas les types, les valeurs seulement.
    Je rappelle la méthode avec les même paramètres à l'exception du premier qui est du même type pour toutes mes fonctions et que je change

  10. #10
    Membre expérimenté 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
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par Ceubex Voir le message
    Non pas les types, les valeurs seulement.
    Je rappelle la méthode avec les même paramètres à l'exception du premier qui est du même type pour toutes mes fonctions et que je change
    Ok, le code que je viens de poster au-dessus considère que tous les paramètres sont du même type (String). Ou alors tu changesen

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    Ok merci ça marche pour moi.
    Dernières questions, avec la reflexivité on a la méthode : maMethode.invoke(objet, parametres);
    Mon soucis est que ma méthode est dans une classe abstraite, du coup il n'y a pas d'objet à mettre dans le invoke. Comment faire pour passer outre ce problème ?

    Sinon j'ai un autre problème, j'ai l'impression que java n'aime pas trop tout ce qui est abstrait/static, j'ai l'erreur "java.lang.NoSuchMethodException: Indice.sansDonnees([LCours;, Config)" lorque je prend ma methode avec m = c.getMethod("sansDonnees", paramTypes);
    Ma méthode est definie comme il suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    abstract class Indice {
    	static void sansDonnees(Cours[] action,Config conf)
    	{
    	....
    	}
    }

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    Ok alors pour mes des questions :
    - il faut mettre null
    - il faut declarer la fonction en public

+ 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