考虑这个人为设计的类:
import java.util.List;
public class Test {
public String chooseRandom(List<String> strings) {
return null;
}
}
当使用反射检查这个方法时,我怎样才能得到 Class
表示 java.lang.String
的对象(甚至是字符串 "java.lang.String"
)在查看 chooseRandom
的参数时?
我知道 Java 在编译时删除类型,但它们必须仍然存在,因为 javap
可以正确打印它们。正在运行 javap
在这个编译类上的结果是:
Compiled from "Test.java"
public class Test {
public Test();
public java.lang.String chooseRandom(java.util.List<java.lang.String>);
}
java.util.List
的参数化类型( java.lang.String
) 绝对可用...我只是不知道它是什么。
我已经试过了:
Class clazz = [grab the type of chooseRandom's parameter list's first argument];
String typeName = clazz.getName();
TypeVariable[] genericTypes = clazz.getTypeParameters();
if(null != genericTypes && 0 < genericTypes.length)
{
boolean first = true;
typeName += "<";
for(TypeVariable type : genericTypes)
{
if(first) first = false;
else typeName += ",";
typeName += type.getTypeName();
}
typeName = typeName + ">";
}
这给了我一个 typeName
的 java.util.List<E>
.我希望的是 java.util.List<java.lang.String>
.
我已经阅读了一些关于 SO 的其他问题和答案,但它们似乎都没有真正回答这个问题,或者即使他们回答了,也没有与之相关的工作代码并且解释......很薄。
最佳答案
使用 getGenericParameterTypes
和 getActualTypeArguments
方法:
Method m = Test.class.getMethod("chooseRandom", List.class);
Type t = m.getGenericParameterTypes()[0];
// we know, in this case, that t is a ParameterizedType
ParameterizedType p = (ParameterizedType) t;
Type s = p.getActualTypeArguments()[0]; // class java.lang.String
在实践中,如果您不知道至少有一个参数并且它是通用的并且具有一种类型参数,那么您当然必须添加一些检查。
关于java - 如何从参数化类型方法参数中获取参数化类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28354509/