begin process at 2012 02 09 09:28:36
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Api

 > INSTANCIER DYNAMIQUEMENT UN OBJET "METHOD"

INSTANCIER DYNAMIQUEMENT UN OBJET "METHOD"


 Information sur la source

Note :
Aucune note
Catégorie :Api Classé sous :introspection, reflect, Method Niveau :Initié Date de création :01/11/2007 Date de mise à jour :04/08/2011 10:01:42 Vu :4 862

Auteur : celphys2

Ecrire un message privé
Site perso
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

 Description

Bonjour,

Dernièrement je développe "une boite noire" sensée être capable d'appeler n'importe quelle méthode java avec des parametres simples en argument.( moyennant un peu de config XML pour mapper les arguments avec mes données en entrée).

A mon grand étonnement je n'ai pas trouvé de source permettant de retrouver l'objet "Method" depuis son expression (lorsque l'on fait du instanceDeMethode.toString()...). Je n'ai pas trop fouillé alors j'ai fait une petit méthode.

Avec ca je configure super simplement le fonctionnement: Pour une méthode X je mets telle donnée en entrée pour tel argument.


Source

  • package fr.celphys;
  • import java.lang.reflect.Method;
  • /**
  • * Classe utilisée pour regrouper plusieurs méthodes
  • * utilitaire pour utilisation des elemnts de l'API
  • * reflect.
  • */
  • public final class ReflectUtils {
  • /**
  • * Pas de constructeur par défaut à la compil.
  • */
  • private ReflectUtils() {
  • }
  • /**
  • * Permet de charger un objet de type METHOD depuis un expression String (issue de Method.toString()).
  • * @param fullName
  • * nom de la méthode
  • * @return
  • * methode chargée
  • * @throws ClassNotFoundException
  • * nom de classe non valide
  • * @throws NoSuchMethodException
  • * pas de méthode avec ce nom pour la classe
  • */
  • public static Method getMethodFromString(final String fullName)
  • throws ClassNotFoundException, NoSuchMethodException {
  • // 1) Utilisons les parenthère pour extraire la bonne sous chaine d'un method.toString().
  • Method targetmethod = null;
  • String[] elements = fullName.split(" ");
  • if (elements == null || elements.length < 2) {
  • //--> Tentative d'extraction de la sous chains ave une reg exp ... très long O_O...
  • throw new IllegalArgumentException("Cannot be Method expression, please check : "
  • + "^([a-zA-Z0-9.]*)+([(])+([a-zA-Z0-9.]*)+([)])$");
  • }
  • String str = null;
  • boolean found = false;
  • int indexElements = 0;
  • int indexBegin = -1;
  • int indexEnd = -1;
  • while (!found && indexElements < elements.length) {
  • str = elements[indexElements];
  • indexBegin = str.indexOf("(");
  • indexEnd = str.indexOf(")");
  • found = (indexBegin != -1 && indexEnd != -1);
  • indexElements++;
  • }
  • if (!found) {
  • throw new IllegalArgumentException("Bad Expression cannot find method expression");
  • } else {
  • String methodCompleteName = str.substring(0, indexBegin);
  • String methodSimpleName = methodCompleteName.substring(methodCompleteName.lastIndexOf(".") + 1);
  • String methodClassName = methodCompleteName.substring(0, methodCompleteName.lastIndexOf("."));
  • System.out.println("Retrieving method <" + methodSimpleName + "> from class <" + methodClassName + ">");
  • String[] parameterTypes = str.substring(indexBegin + 1, indexEnd).split(",");
  • Class[] parametersClasses = new Class[parameterTypes.length];
  • for (int indexParam = 0; indexParam < parameterTypes.length; indexParam++) {
  • String param = parameterTypes[indexParam];
  • if (param == null || param.trim().length() < 1) {
  • // Pas de paramètre
  • parametersClasses = null;
  • } else {
  • Class classe = null;
  • // On essaie avec le nom de classe
  • try {
  • classe = Class.forName(param);
  • } catch (ClassNotFoundException e) {
  • // Gestion des types Simples
  • if (Integer.TYPE.getName().equals(param)) {
  • classe = Integer.TYPE;
  • } else if (Long.TYPE.getName().equals(param)) {
  • classe = Long.TYPE;
  • } else if (Double.TYPE.getName().equals(param)) {
  • classe = Double.TYPE;
  • } else if (Float.TYPE.getName().equals(param)) {
  • classe = Float.TYPE;
  • } else if (Boolean.TYPE.getName().equals(param)) {
  • classe = Boolean.TYPE;
  • } else {
  • classe = null;
  • }
  • }
  • parametersClasses[indexParam] = classe;
  • }
  • }
  • // Maintenant nous allons créer la méthode
  • Class targetClass = Class.forName(methodClassName);
  • targetmethod = targetClass.getMethod(methodSimpleName, parametersClasses);
  • }
  • return targetmethod;
  • }
  • }
package fr.celphys;
import java.lang.reflect.Method;

/**
 * Classe utilisée pour regrouper plusieurs méthodes
 * utilitaire pour utilisation des elemnts de l'API
 * reflect.
 */
public final class ReflectUtils {

    /**
     *  Pas de constructeur par défaut à la compil.
     */
    private ReflectUtils() {
    }

    /**
     * Permet de charger un objet de type METHOD depuis un expression String (issue de Method.toString()).
     * @param fullName
     *          nom de la méthode
     * @return
     *          methode chargée
     * @throws ClassNotFoundException
     *          nom de classe non valide
     * @throws NoSuchMethodException
     *          pas de méthode avec ce nom pour la classe
     */
    public static Method getMethodFromString(final String fullName)
    throws ClassNotFoundException, NoSuchMethodException {
        // 1) Utilisons les parenthère pour extraire la bonne sous chaine d'un method.toString().
        Method targetmethod    = null;
        String[] elements = fullName.split(" ");
        if (elements == null || elements.length < 2) {
            //--> Tentative d'extraction de la sous chains ave une reg exp ... très long O_O...
            throw new IllegalArgumentException("Cannot be Method expression, please check : "
                    + "^([a-zA-Z0-9.]*)+([(])+([a-zA-Z0-9.]*)+([)])$");
        }
        String str = null;
        boolean found     = false;
        int indexElements = 0;
        int indexBegin    = -1;
        int indexEnd      = -1;
        while (!found && indexElements < elements.length) {
            str = elements[indexElements];
            indexBegin = str.indexOf("(");
            indexEnd   = str.indexOf(")");
            found =  (indexBegin != -1 && indexEnd != -1);
            indexElements++;
        }
        if (!found) {
            throw new IllegalArgumentException("Bad Expression cannot find method expression");
        } else {
            String methodCompleteName = str.substring(0, indexBegin);
            String methodSimpleName = methodCompleteName.substring(methodCompleteName.lastIndexOf(".") + 1);
            String methodClassName  = methodCompleteName.substring(0, methodCompleteName.lastIndexOf("."));
            System.out.println("Retrieving method <" + methodSimpleName + "> from class <" + methodClassName + ">");
            String[] parameterTypes = str.substring(indexBegin + 1, indexEnd).split(",");
            Class[] parametersClasses = new Class[parameterTypes.length];
            for (int indexParam = 0; indexParam < parameterTypes.length; indexParam++) {
                String param = parameterTypes[indexParam];
                if (param == null || param.trim().length() < 1) {
                    // Pas de paramètre
                    parametersClasses = null;
                } else {
                    Class classe = null;
                    // On essaie avec le nom de classe
                    try {
                        classe = Class.forName(param);
                    } catch (ClassNotFoundException e) {
                        // Gestion des types Simples
                        if (Integer.TYPE.getName().equals(param)) {
                            classe = Integer.TYPE;
                        } else if (Long.TYPE.getName().equals(param)) {
                            classe = Long.TYPE;
                        } else if (Double.TYPE.getName().equals(param)) {
                            classe = Double.TYPE;
                        } else if (Float.TYPE.getName().equals(param)) {
                            classe = Float.TYPE;
                        } else if (Boolean.TYPE.getName().equals(param)) {
                            classe = Boolean.TYPE;
                        } else {
                            classe = null;
                        }
                    }
                    parametersClasses[indexParam] = classe;
                }
            }
          // Maintenant nous allons créer la méthode
          Class targetClass = Class.forName(methodClassName);
          targetmethod = targetClass.getMethod(methodSimpleName, parametersClasses);
        }
        return targetmethod;
    }    
   
}

 Conclusion

Dans le zip vous trouverez une classe Main pour tester...


 Historique

01 novembre 2007 14:58:01 :
corrections orthographes
04 août 2011 10:01:43 :
Suppression BUG

 Sources du même auteur

Source avec Zip CLASSE UTILITAIRE POUR PARSER DES XML AVEC XPATH ET DOM.

 Sources de la même categorie

Source avec une capture AUTO FOLLOW/UNFOLLOW AVEC JTWITTER/OAUTHSIGNPOSTCLIENT ET SW... par GeroXXXX
Source avec Zip LOGICIEL MESSAGERIE par layeure
Source avec Zip Source avec une capture CRÉER DES GRAPHIQUES : UTILISATION DE JFREECHART par Julien39
EJB3-BEAN ENTITÉ : RELATIONS BIDIRECTIONNELLES par SoftDeath
Source avec Zip Source avec une capture LETMESEE : CAPTURE D'ÉCRAN À INTERVALLE RÉGULIER : UTILISATI... par pyo656

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture EDITEUR DE COURBES par jojolemariole
Source avec Zip Source avec une capture CLASSEXPLORER : EXPLORATEUR DE CLASSES JAVA par Chatbour
Source avec Zip JARLOADER par sheorogath
Source avec Zip L'INTROSPECTION ET JDBC par aamine4
RÉCUPÉRATION ET INVOCATION DYNAMIQUE DES MÉTHODES D'UNE CLAS... par vieuxLion

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Le bon, la brute et l'introspection [ par bouiboui ] Bonjour,je voudrais savoir s'il est possible de connaitre toutes les classes d'un package java en utilisant l'introspection (package reflect) de java, Le bon, la brute et l'introspection [ par bouiboui ] Bonjour,je voudrais savoir s'il est possible de connaitre toutes les classes d'un package java en utilisant l'introspection (package reflect) de java, erreur static method et non-static context [ par beannou ] salut, voila j'ai une erreur que je sais pas d'ou elle vient : j'ai une actionPerformed : private void listeNoeudActionPerformed(java.awt.event.Actio comment utiliser invoke!!! [ par princessagnes ] Bonjour à tous, je crée un menu qui comporte des lignes de menu. chaque ligne de menu comporte une methode,qui est appelée grace à "lancer_methode". J Introspection [ par Nina2507 ] sltSVP j'ai besion d'une classe introspection pour faire les opération de base pour les base de données : select, insert, update, deletesi vous avez c Parcourir les classes d'un projet (introspection) [ par tenthor ] Bonjour, Je vous explique mon problème, en fait je suis un newbie dans le java et j'ai un peu de mal. J'ais une application (je développe avec eclipse Introspection (ivoke) [ par tenthor ] Bonjour a tous ! Je développe un bout de code en ce moment, qui utilise l'introspection. J'ai un probleme avec la méthode invoke(Object obj, Object... encore une erreur non-static method [ par WyattFR ] Ayant bloqué sur un autre projet java (ou j'ai aussi posté une question), je me retrouve de nouveau bloqué.Voici mon code : Login.java : <font color=" réfléxivité - Comment transtyper un objet de type Object en une liste de type dynamique [ par AlexN ] Salut,Je veux remplir une table avec des données provenant de plusieurs tables dont les types correspondants descendent tous de la même classe.Class F Erreur:"java.lang.reflect.InvocationTargetException" et service web [ par nehla ] salutje suis entrain d'implémenter un service web avec le langage java sous l'éditeur eclipse. Je suit un exemple que j'ai trouvé sur le net à l'adres


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales