2009-11-11 9 views
5

Soy nuevo en eclipse el desarrollo de complementos y estoy tratando de convertir un IMethod en una representación de cadena del nombre completo del método. ES DECIR.Usar JDT para obtener el nombre completo del método

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

Hasta ahora he tenido que rodar manualmente mi propia solución. ¿Hay una mejor manera?

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

Respuesta

3

Gracias a iain y algo más de investigación, he encontrado esta solución. Parece que algo así debería integrarse en el 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

Eso es bueno, nunca vi la clase Signature antes – iain

0

No estoy seguro de que tomaría en cuenta todos los casos (método dentro de una clase interna, una clase anónima, con parámetros genéricos ...)

Cuando se trata de métodos de firmas, a las clases estudiar son:

Debe obtener el jdt.core.dom.IMethodBinding, desde donde puede extraer todo lo que necesita.

Si usted tiene un MethodInvocation, puede:

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

Yep. VonC hace un buen punto. ITypeBindings que representan clases locales y clases anónimas devolverá la cadena vacía cuando se llame a getFullyQualifiedName(). Esto tiene sentido, ya que no tienen un nombre oficial, pero si está utilizando nombres totalmente calificados para tener un identificador único, puede considerar usar getKey() en su lugar ... –

4

, usted puede obtener el nombre completo para el tipo de uso de

method.getDeclaringType().getFullyQualifiedName(); 

Ésta es probablemente más fácil de acceder al paquete de la unidad de compilación . El resto de tu función parece correcta.

Un pequeño punto: debe usar StringBuilder para construir la cadena en lugar de agregarla a una cadena estándar. Las cadenas son inmutables, por lo que la adición crea una gran cantidad de objetos temporales irreparables.

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

Esto se ve bien. Encontré una manera de hacer que los tipos de parámetros sean más legibles, así que combinaré esta solución con la mía. –

Cuestiones relacionadas