使用JDT获取完整方法名

6

我是新手,正在学习Eclipse插件开发。我试图将IMethod转换为完整方法名称的字符串表示形式。

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个回答

5

您可以使用以下方法获取类型的完全限定名称:

method.getDeclaringType().getFullyQualifiedName();

从编译单元访问软件包可能比您的函数更容易。您的其余部分看起来是正确的。

一个小提示:您应该使用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();
}

这看起来不错。我找到了一种使参数类型更易读的方法,所以我将把这个解决方案与我的解决方案结合起来。 - James Van Boxtel

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

这很好,我以前从未见过 Signature 类。 - iain

0

我不确定它是否考虑了所有情况(如内部类中的方法、匿名类、带有泛型参数的情况...)

当涉及到方法签名时,需要查看的类包括:

你需要获取jdt.core.dom.IMethodBinding,从中提取出你所需的所有内容。
如果你有一个MethodInvocation,你可以:
//MethodInvocation node
ITypeBinding type = node.getExpression().resolveTypeBinding();
IMethodBinding  method=node.resolveMethodBinding();

没错,VonC说得很对。表示本地类和匿名类的ITypeBindings在调用getFullyQualifiedName()时将返回空字符串。这是有道理的,因为它们没有正式名称,但如果您正在使用完全限定名称以获得唯一标识符,则可能要考虑改用getKey()。 - Nels Beckman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接