2009-11-11 4 views
5

Я новичок в разработке плагинов eclipse, и я пытаюсь преобразовать IMethod в строковое представление полного имени метода. И.Е.Использовать JDT для получения полного имени метода

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

До сих пор мне приходилось вручную рулить свое решение. Есть ли способ лучше?

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

ответ

3

Благодаря iain и еще нескольким исследованиям я придумал это решение. Кажется, что что-то подобное должно быть встроено в 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

Хорошо, что я никогда не видел класс Signature – iain

0

Я не уверен, что он будет принимать во внимание все случаи (метод во внутреннем классе, анонимный класс, с родовыми параметрами ...)

Когда речь идет о методах подписи, классы в смотреть на это:

Вам необходимо получить jdt.core.dom.IMethodBinding, из которого вы можете извлечь все, что вам нужно.

Если у вас есть MethodInvocation, вы можете:

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

Да. VonC делает хороший момент. ITypeBindings, представляющие локальные классы и анонимные классы, возвращают пустую строку при вызове getFullyQualifiedName(). Это имеет смысл, поскольку у них нет официального имени, но если вы используете полностью квалифицированные имена, чтобы иметь уникальный идентификатор, вы можете захотеть использовать getKey() вместо этого ... –

4

Вы можете получить полное имя типа с помощью

method.getDeclaringType().getFullyQualifiedName(); 

Это, наверное, проще, чем доступ пакет из единицы компиляции , Остальные функции выглядят правильно.

Один маленький пункт: вы должны использовать StringBuilder для создания строки вместо добавления к стандартной String. Строки неизменяемы, поэтому добавление создает множество нерегулярных темных объектов.

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

Это выглядит хорошо. Я нашел способ сделать типы параметров более удобочитаемыми, поэтому я объединю это решение с моим. –

Смежные вопросы