我必须获取方法参数的完全限定名称。
例如:
public void display(Custom1 a, Custom2 b) {
String x = a.getValue();
String y = b.getValue();
}
此处,Custom1
和Custom2
位于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]);
}
答案 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;