Java 使用JDT获取完整的方法名

Java 使用JDT获取完整的方法名,java,eclipse-plugin,eclipse-jdt,Java,Eclipse Plugin,Eclipse Jdt,我是eclipse插件开发的新手,我正在尝试将IMethod转换为完整方法名的字符串表示形式。即 my.full.package.ClassName.methodName(int param, String string) 到目前为止,我不得不亲自提出自己的解决方案。有更好的办法吗 private static String getMethodFullName(IMethod iMethod) { String packageString = "[Default Package]";

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

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

对于方法签名,要研究的类有:

你需要得到你所需要的一切

如果您有
MethodInvocation
,您可以:

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

您可以使用

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

多亏了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();
}
import org.eclipse.jdt.core.Signature;
私有静态字符串getMethodFullName(IMethod IMethod)
{
StringBuilder名称=新的StringBuilder();
name.append(iMethod.getDeclaringType().getFullyQualifiedName());
名称。附加(“.”);
append(iMethod.getElementName());
名称。附加(“”);
字符串逗号=”;
String[]parameterTypes=iMethod.getParameterTypes();
试一试{
字符串[]parameterNames=iMethod.getParameterNames();

对于(int i=0;它看起来不错。我找到了一种使参数类型更具可读性的方法,所以我将把这个解决方案与我的结合起来。这很好,我以前从未见过签名类。VonC的观点很好。当getFullyQualifiedName()时,表示本地类和匿名类的ITypeBindings将返回空字符串这是有意义的,因为它们没有正式名称,但是如果您使用完全限定名以获得唯一标识符,则可能需要考虑使用GETKY()来代替…