2009-11-11 19 views
5

私はEclipseプラグインの開発には新しく、メソッド全体の文字列表現にIMethodを変換しようとしています。 I.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(); 

を使用してタイプの完全修飾名を取得することができます。あなたの残りの機能は正しいように見えます。

小さな点:標準のStringに追加する代わりに、StringBuilderを使用して文字列を構築する必要があります。文字列は不変なので、追加すると、臨時の一時的でないオブジェクトのロードが作成されます。

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

これはうまく見えます。私はパラメータ型をより読みやすくする方法を見つけたので、このソリューションを私のものと組み合わせます。 –

関連する問題