2009-11-11 10 views
5

Ich bin neu in der Entwicklung von Eclipse-Plugins und versuche eine IMethod in eine String-Repräsentation des vollständigen Methodennamens zu konvertieren. I.E.Verwenden Sie JDT, um den vollständigen Methodennamen zu erhalten

my.full.package.ClassName.methodName(int param, String string) 

Bisher musste ich meine eigene Lösung rollen lassen. Gibt es einen besseren Weg?

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; 
} 

Antwort

3

Dank iain und ein paar mehr Forschung habe ich diese Lösung gefunden. Es scheint, dass so etwas in den JDT eingebaut werden sollte ....

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(); 
} 
+0

Das ist nett, ich habe die Signature-Klasse nie zuvor gesehen – iain

0

Ich bin nicht sicher, ob es unter Berücksichtigung aller Fälle nehmen würde (Methode innerhalb einer internen Klasse, eine anonyme Klasse, mit generischen Parametern, ...)

Wenn es um die Methoden Signaturen kommt, die Klassen zu Blick in sind:

Sie müssen die jdt.core.dom.IMethodBinding erhalten, aus der Sie alles extrahieren können, was Sie brauchen.

Wenn Sie eine MethodInvocation haben, können Sie:

//MethodInvocation node 
ITypeBinding type = node.getExpression().resolveTypeBinding(); 
IMethodBinding method=node.resolveMethodBinding(); 
+0

Ja. VonC macht einen guten Punkt. ITypeBindings, die lokale Klassen und anonyme Klassen darstellen, geben die leere Zeichenfolge zurück, wenn getFullyQualifiedName() aufgerufen wird. Dies ist sinnvoll, da sie keinen offiziellen Namen haben. Wenn Sie jedoch voll qualifizierte Namen verwenden, um eine eindeutige Kennung zu erhalten, sollten Sie stattdessen die Verwendung von getKey() in Erwägung ziehen ... –

4

Sie können den vollqualifizierten Namen für den

method.getDeclaringType().getFullyQualifiedName(); 

mit Typ bekommen Dies ist wahrscheinlich einfacher als das Paket von der Übersetzungseinheit zugreifen . Der Rest von Ihnen funktioniert korrekt.

Ein kleiner Punkt: Sie sollten StringBuilder verwenden, um die Zeichenfolge zu erstellen, anstatt zu einem Standard-String hinzuzufügen. Strings sind unveränderlich, so dass zusätzliche unfrische temporäre Objekte entstehen.

+0

Das sieht gut aus. Ich habe einen Weg gefunden, die Parametertypen lesbarer zu machen, also werde ich diese Lösung mit meinen kombinieren. –

Verwandte Themen