6

私は Eclipse プラグイン開発が初めてで、IMethod を完全なメソッド名の文字列表現に変換しようとしています。IE

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

3 に答える 3

5

を使用して、型の完全修飾名を取得できます。

method.getDeclaringType().getFullyQualifiedName();

これはおそらく、コンパイル ユニットからパッケージにアクセスするよりも簡単です。残りの機能は正しく見えます。

1 つの小さな点: 標準の 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();
}
于 2009-11-11T15:54:00.483 に答える
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();
}
于 2009-11-12T19:37:15.207 に答える
0

すべてのケース(内部クラス内のメソッド、ジェネリックパラメーターを持つ匿名クラス...)を考慮に入れるかどうかはわかりません。

メソッドのシグネチャに関しては、調べるクラスは次のとおりです。

を取得する必要がjdt.core.dom.IMethodBindingあります。そこから、必要なものをすべて抽出できます。

をお持ちの場合はMethodInvocation、次のことができます。

//MethodInvocation node
ITypeBinding type = node.getExpression().resolveTypeBinding();
IMethodBinding  method=node.resolveMethodBinding();
于 2009-11-11T08:18:39.597 に答える