如何在方法中获取参数值的完全限定名称

时间:2015-01-05 07:49:34

标签: java reflection eclipse-jdt

我必须获取方法参数的完全限定名称。

例如:

public void display(Custom1 a, Custom2 b) {
    String x = a.getValue();
    String y = b.getValue();
}

此处,Custom1Custom2位于com.test.resource,因此我需要获取值

com.test.resource.Custom1

我在我的eclipse插件中需要这个..我使用了IMethod.getParameterTypes()。结果就像

QCustom1; 

如何获取方法参数的完全限定名称?

String[] parameterNames = iMethod.getParameterNames();                  
ILocalVariable[] parameterTypes = currentmethod.getMethod().getParameters();                
for (int j=0; j < parameterNames.length; ++j) {         
    System.out.println("parameter name:" + parameterNames[j]);
    System.out.println("parameter type:" + parameterTypes[j]);
}

3 个答案:

答案 0 :(得分:3)

如果您想避免反射并且更喜欢纯JDT解决方案(在Eclipse插件中,反射API不是非常友好),下面是另一种选择。

为了解码JDT编码类型名称,您应该使用Signature类。

解决类型名称部分

重要的一步是解决声明IType对象能够使用此类型导入重新计算全名的方法。然后#resolveType(simpleName)方法可以帮助您。它的用途很微妙。

从部件构建全名

以下是从参数类型编码名称到全名的代码,它在解析声明类型的名称时采用第一种解决方案:

ILocalVariable parameterVariable = ...
IType declaringType = method.getDeclaringType();
String name = parameterVariable.getTypeSignature();
String simpleName = Signature.getSignatureSimpleName(name);
String[][] allResults = declaringType.resolveType(simpleName);
String fullName = null;
if(allResults != null) {
    String[] nameParts = allResults[0];
    if(nameParts != null) {
        fullName = new String();
        for(int i=0 ; i < nameParts.length ; i++) {
            if(fullName.length() > 0) {
                fullName += '.';
            }
            String part = nameParts[i];
            if(part != null) {
                fullName += part;
            }
        }
    }
}
return fullName;

在不使用Signature类的情况下,以相同的方式从简单名称(非JDT编码)获取全名。结果类型的解决方案是相同的,here是代码。

答案 1 :(得分:1)

您可以使用反射加载相应的方法并逐个获取参数值。

    if(method.getName().equals(iMethod.getMethodname())){

                          /**
                           * cheking whether the length of the parameter are equal
                           */
                        if(method.getParameterTypes().length==iMethod.getParam().length){

                            /**
                             * getting the fully qualified name of the selected method paramater value
                             */
                            Class<?>[] paramvalue=method.getParameterTypes();

                            for(int p=0;p<paramvalue.length;p++){

                                /**
                                 * checking whether teh parameter are same for loading teh datastore
                                 */
                                if(paramvalue[p].getSimpleName().equals(temp)){

                                    String fullyqualifiedname=paramvalue[p].getName();


                                }

                            }
                        }

                    }
             }

答案 2 :(得分:0)

这是bdulacs answer的变体。它更多地使用了Signature类。因此,源代码甚至更短。它仍然避免反射,是纯粹的JDT解决方案。

作为原始答案,此解决方案是从参数类型编码名称到全名的代码,它从声明类型解析名称时获取declaringType.resolveType()的第一个结果:

ILocalVariable parameterVariable = ...
IType declaringType = method.getDeclaringType();
String name = parameterVariable.getTypeSignature();
String simpleName = Signature.getSignatureSimpleName(name);
String[][] allResults = declaringType.resolveType(simpleName);
if(allResults != null && allResults[0] != null) {
    return Signature.toQualifiedName(allResults[0])
}
return null;