begin process at 2010 02 10 01:25:40
  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 :01/11/2007 14:58:01 Vu / téléchargé :3 584 / 109

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.
  • *
  • * @author Celphys
  • */
  • 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.
 *
 * @author Celphys
 */
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...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

01 novembre 2007 14:58:01 :
corrections orthographes

 Sources du même auteur

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

 Sources de la même categorie

ENVOI D'UNE ARBORESSENCE EN JAVA VERS SERVEUR FTP par moumou95
ENREGISTRER L'ARBORESCENCE D'UN JTREE DANS UN XML AVEC JDOM par coltman
Source avec Zip WIZARD JAVA API par aissam36
JCONFIGURATIONMANAGER - GESTION DES CONFIGURATIONS par Francks11
Source avec Zip Source avec une capture FRAGMENTER, DÉFRAGMENTER UN FICHIER par Chatbour

 Sources en rapport avec celle ci

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 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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,671 sec (3)

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