Java 使用JDT获取完整的方法名
我是eclipse插件开发的新手,我正在尝试将IMethod转换为完整方法名的字符串表示形式。即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]";
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()来代替…