2009-11-11 25 views
5

Sono nuovo nello sviluppo di plug-in di eclipse e sto provando a convertire un IMethod in una rappresentazione di stringa del nome completo del metodo. OSSIAUsa JDT per ottenere il nome completo del metodo

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

finora ho dovuto girare a mano la mia soluzione. C'è un modo migliore?

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

risposta

3

Grazie a iain e qualche altra ricerca ho trovato questa soluzione. Sembra che qualcosa del genere dovrebbe essere incorporato nel 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(); 
} 
+0

Che bello non ho mai visto prima la classe Signature – iain

0

io non sono sicuro che sarebbe prendere in considerazione tutti i casi (metodo all'interno di una classe interna, una classe anonima, con i parametri generici ...)

Quando si tratta di metodi di firme, le classi a esaminare sono:

È necessario ottenere il jdt.core.dom.IMethodBinding, da cui è possibile estrarre tutto ciò che è necessario.

Se si dispone di un MethodInvocation, è possibile:

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

Sì. VonC è un buon punto. ITypeBindings che rappresentano classi locali e classi anonime restituirà la stringa vuota quando viene chiamato getFullyQualifiedName(). Questo ha senso, dal momento che non hanno un nome ufficiale, ma se si utilizzano nomi completi per avere un identificatore univoco, si potrebbe prendere in considerazione l'utilizzo di getKey() invece ... –

4

è possibile ottenere il nome completo per il tipo di utilizzo

method.getDeclaringType().getFullyQualifiedName(); 

Questo è probabilmente più facile che l'accesso al pacchetto dal unità di compilazione . Il resto della tua funzione sembra corretta.

Un piccolo punto: è necessario utilizzare StringBuilder per creare la stringa anziché aggiungerla a una stringa standard. Le stringhe sono immutabili, quindi l'aggiunta crea un sacco di oggetti tempari non necessari.

+0

Questo sembra buono. Ho trovato un modo per rendere più leggibili i tipi di parametri, quindi combinerò questa soluzione con la mia. –

Problemi correlati