6
votes

Utilisez JDT pour obtenir le nom de la méthode complète

Je suis nouveau au développement du plug-in Eclipse et j'essaie de convertir une imethod en une représentation de chaîne du nom de la méthode complète. I.E.

private static String getMethodFullName(IMethod iMethod)
{
    String packageString = "[Default Package]";
    try {
        IPackageDeclaration[] declarations = iMethod.getCompilationUnit().getPackageDeclarations();
        if(declarations.length > 0)
        {
            packageString = declarations[0].getElementName(); 
        }           
    } catch (JavaModelException e) {
    }

    String classString = iMethod.getCompilationUnit().getElementName();
    classString = classString.replaceAll(".java", "");

    String methodString = iMethod.getElementName() + "(";
    for (String type : iMethod.getParameterTypes()) {
        methodString += type + ",";
    }
    methodString += ")";

    return packageString + "." + classString + "." + methodString;
}


0 commentaires

3 Réponses :


0
votes

Je ne suis pas sûr qu'il prendrait en compte tous les cas (méthode dans une classe interne, une classe anonyme, avec des paramètres génériques ...)

En ce qui concerne les méthodes signatures, les classes à examiner sont: < / p>


1 commentaires

Ouais. VONC fait un bon point. ItypeBindingings représentant des classes locales et des classes anonymes retournera la chaîne vide lorsqu'il est appelé gaitivementqualifeName (). Cela a du sens, car ils n'ont aucun nom officiel, mais si vous utilisez des noms entièrement qualifiés afin d'avoir un identifiant unique, vous voudrez peut-être envisager d'utiliser Getkey () à la place ...



5
votes

Vous pouvez obtenir le nom pleinement qualifié pour le type à l'aide de

private static String getMethodFullName(IMethod iMethod)
{
        StringBuilder name = new StringBuilder();
        name.append(iMethod.getDeclaringType().getFullyQualifiedName());
        name.append(".");
        name.append(iMethod.getElementName());
        name.append("(");

        String comma = "";
        for (String type : iMethod.getParameterTypes()) {
                name.append(comma);
                comma = ", ";
                name.append(type);
        }
        name.append(")");

        return name.toString();
}


1 commentaires

Cela semble bon. J'ai trouvé un moyen de rendre les types de paramètres plus lisibles afin que je combine cette solution avec la mine.



3
votes

Merci à IAIN et d'autres recherches que j'ai proposées avec cette solution. On dirait que quelque chose comme ça devrait être intégré à la JDT ....

import org.eclipse.jdt.core.Signature;

private static String getMethodFullName(IMethod iMethod)
{
        StringBuilder name = new StringBuilder();
        name.append(iMethod.getDeclaringType().getFullyQualifiedName());
        name.append(".");
        name.append(iMethod.getElementName());
        name.append("(");

        String comma = "";
        String[] parameterTypes = iMethod.getParameterTypes();
        try {
            String[] parameterNames = iMethod.getParameterNames();
            for (int i=0; i<iMethod.getParameterTypes().length; ++i) {
                name.append(comma);
                name.append(Signature.toString(parameterTypes[i]));
                name.append(" ");
                name.append(parameterNames[i]);
                comma = ", ";
            }
        } catch (JavaModelException e) {
        }

        name.append(")");

        return name.toString();
}


1 commentaires

C'est bien que je n'ai jamais vu la classe de signature avant