Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Trouver la signature d'une méthode [ Divers / Général ] (super_toinou)

vendredi 26 septembre 2008 à 14:41:31 | Trouver la signature d'une méthode

super_toinou

Bonjour à tous,

je bloque sur un problème qui pourtant me parait simple : dans un bout de code je cherche à avoir la méthode qui a appelé ce bout de code.

Pour ce faire on peut utiliser un code du style
Throwable t = new Throwable();
StackTraceElement[] elems = t.getStackTrace();

Problème : sur un StackTraceElement, je peux avoir le nom de la méthode, sa ligne et d'autres trucs. Mais pas la signature de la méthode.

Question :  comment on fait pour retrouver la signature ?

Pour info je ne veux pas introspecter, ce serait trop lourd et vu que j'ai plusieurs méthodes qui portent le même nom, le getMethodName() ne rend pas un "identifiant" unique et vu aussi que le code à vocation à bouger le getLineNumber() ne me servira pas à grand chose

Merci à tous.

++ Toinou



vendredi 26 septembre 2008 à 16:40:50 | Re : Trouver la signature d'une méthode

Chatbour

Membre Club
Salut,

voici une solution mais avec l'introspection


import java.lang.reflect.*;

public class Test {

    public String getMethodSignature(Method method) {       
        StringBuilder str = new
StringBuilder ();
        str.append(Modifier.toString(method.getModifiers()) + " " + method.getReturnType().getCanonicalName() +  " " + method.getName());
        // Les paramètres
        str.append(" (");
        for (Class parameter : method.getParameterTypes()) {
            str.append(parameter.getCanonicalName() + ", ");
        }
        str.deleteCharAt(str.length() - 2);
        str.append(") ");
        // Les exception levées
        if (method.getExceptionTypes().length != 0) {
            str.append(" throws ");
           
for (Class exception : method.getExceptionTypes()) {
                str.append(exception.getName() + ", ");
            }
            str.deleteCharAt(str.length() - 2);
        }
       
        return str.toString();
    }
   
    public static void main(
String [] args) throws Exception {
        Class c =
Class .forName("java.io.FileReader");
       
Method method = c.getMethod("close");
       
       
String signature = new Test().getMethodSignature(method);
        System.out.println(signature);
    }
}



Cordialement..

_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..

vendredi 26 septembre 2008 à 17:46:47 | Re : Trouver la signature d'une méthode

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

pour la signature, tu parles de la signature équivalente à JNI ? si oui tu peux t'inspirer du code ci-dessous :


   /**
     * Récupération de la signature JNI de la méthode
     * @param m Méthode à tester
     * @return récupération de la signature.
     */
    public static String getJNISignature(Method m) {
        String retType = m.getReturnType().getName();
        StringBuilder params = new StringBuilder();
        for(Class<?> param :  m.getParameterTypes())
            params.append(getJNIType(param.getName()));
        return "(" + params.toString() + ")" + getJNIType(retType);
    }
   
    /**
     * Ajustement du type conformément à JNI
     * @param in Type d'entrée
     * @return type ajusté
     */
    public static String getJNIType(String in) {
        String ret = in;
        if(in.equals("void")) ret = "V";
        else if(in.equals("int")) ret = "I";
        else if(in.equals("long")) ret = "J";
        else if(in.equals("double")) ret = "D";
        else if(in.equals("float")) ret = "F";
        else if(in.equals("short")) ret = "S";
        else if(in.equals("byte")) ret = "B";
        else if(in.equals("boolean")) ret = "Z";
        else if(in.equals("char")) ret = "C";
        else if(in.indexOf(".") != -1) { // cas des objets
            ret = ret.replaceAll("\\.", "/"); // conforme JNI
            //idem si l'objet ne se termine pas par ';'
            if(!ret.endsWith(";")) ret += ";";
            if(ret.startsWith("[") && ret.charAt(1) != 'L') {
                ret = "[L" + ret.substring(1, ret.length());
            } else if(!ret.startsWith("[") && ret.charAt(0) != 'L') {
                ret = "L" + ret;
            }
        }
        return ret;
    }

utilisation :

public class Test {

    public static void main(String[] args) throws Throwable {
        Method main = Test.class.getMethod("main", String[].class);
        System.out.println(getJNISignature(main)); // retourne '([Ljava/lang/String;)V'

        // ou simplement
        System.out.println(getJNIType(int.class.getName())); // retourne 'I'
        System.out.println(getJNIType(int[].class.getName())); // retourne '[I'
        System.out.println(getJNIType(String.class.getName()));// retourne 'Ljava/lang/String;'
        System.out.println(getJNIType(String[].class.getName()));// retourne '[Ljava/lang/String;'
    }
}


------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO

vendredi 26 septembre 2008 à 17:57:18 | Re : Trouver la signature d'une méthode

super_toinou

Merci à tous les deux pour vos réponses.

Le truc c'est que dès que j'ai une object Method c'est que j'ai fait de l'introspection.
Or je cherche absolument à éviter ça, c'est beaucoup trop couteux car j suis dans un serveur J2EE qui a pas loin d'1 million d'appel ejb en 1 jour ouvré.
Vu que je veux récup la méthode pour chaque appel ejb, si j'introspecte ca va me flinguer la machine (enfin je pense).

 C'est juste que je pige pas pourquoi java ne peut pas me sortir la signature d'une méthode via la stacktrace alors qu'il peut me dire son nom, sa ligne etc...

J pense qu'une autre voie doit être de faire de la programmation par aspect mais j'préfèrerai aussi éviter

Merci en tt cas, j suis preneur pour toute suggestion !!





Cette discussion est classé dans : problème, trouver, code, méthode, signature


Répondre à ce message

Sujets en rapport avec ce message

problème avec une méthode [ par Waldo2188 ] Bonour, Pour mon stage je dois utiliser le JRE 1.4.1 pour développer. Mais le problème c'est que j'ai trouvé un code qui utilise une methode qui n'e problème non identifié [ par wenders77 ] Bonjo récupérer une image "help SVP" [ par 3ajib ] bonjour voila les amis j'ai trouver un code ds ce site  mais aprèe avoir compliler ce code sourse j'ai le message suivant :"Error(67,10): method creat problème d'affichage graphique [ par Hermios ] Bonjour à tous.Tout d'abord, je suis désolé si la réponse à ma question se trouve déjà sur un forum, j'ai essayé de trouver des réponses, mais je ne s Problème avec Scite [ par ihewinp ] Bonjour à tous d' abord.Je suis étudiant en fac de science et donc le premier semestre on commence un peu l' info.J' ai téléchargé scite parce que c' récupérer code source [ par vallgui ] Bonjour,Mon problème est que je dois récupérer les "n" premières lignes d'un code source . Le problème c'es que je ne sais pas comment récupérer les 1 Comment faire un cd avec mon Application? [ par SaTeam ] Salut à tout le monde!J'ai un gros problème, je suis en plein projet pour mes études, le code est tapé et tout fonctionne correctement, mais la phase Problème avec le bouton X [ par Stark ] GeneralStarkSalut,J'ai vu dans une des questions du forum que pour enlever le bouton X présent en haut à droite de la fenêtre il faut utilise problème pour trouver un circuit dans une martice booleenne [ par marc_dd ] Bonjour à tous,Pour mon cours de math je dois faire une application sur des graphes, j'ai presque fini mais il me reste un problème je cherche un algo Sérialisation : méthode load à l'intérieur d'une classe [ par Fatango ] Voila le problème :J'ai une classe Mission dans laquelle je veux créer une méthode save(String PathFile) et load(String PathFile). Pour Save pas de pr


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 1,654 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.