比如:private List<String> name;用反射可以获得Field,getDeclaredField();
但是field的name是interface java.util.List. <String>不见了。但是好像只拿到了List,而不知道怎么拿到List里面的类型是什么,看了API也没找到。
我想要拿到List<String>,也就是要知道List里存的是什么类型的。
请教高手。
但是field的name是interface java.util.List. <String>不见了。但是好像只拿到了List,而不知道怎么拿到List里面的类型是什么,看了API也没找到。
我想要拿到List<String>,也就是要知道List里存的是什么类型的。
请教高手。
{
public List<String> list = new LinkedList<String>();
public static void main(String[] args) throws SecurityException, NoSuchFieldException
{
ParameterizedType pt = (ParameterizedType) GenericTest.class.getField(
"list").getGenericType();
System.out.println(pt.getActualTypeArguments().length);
System.out.println(pt.getActualTypeArguments()[0]);
}
} 1
class java.lang.String
public class GetName<T>
{
static private Class classType; public GetName(Class classType)
{
this.classType = classType;
} public static void main(String[] args)
{
GetName<String> t1 = new GetName<String>(String.class);
System.out.println(classType.getCanonicalName()); GetName<Integer> t2 = new GetName<Integer>(Integer.class);
System.out.println(classType.getCanonicalName()); }
}是不是感觉有点自欺欺人?呵呵
一楼那个因为class已经实例化了,泛型已经定型了。 如果还不明白,你可以把代码反编译就行了。
java中的泛型不是真正意义上的泛型
所以才有了类型擦除的概念
public class Temp { private List<String> list;
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
System.out.println(Temp.class.getDeclaredField("list").getGenericType());
}}
// output: java.util.List<java.lang.String>
List<?> list那字段信息包括泛型信息就是?,如果以后对实例进行赋值list = new ArrayList<String>
读到数据还是?,因为类加载完毕后,一般的操作不会修改类信息。
java.util.List<java.lang.String>这个可以拿到,我知道,
java.lang.String怎么拿到呢?
不要解析字符串。
另外,<>里的可能又是个List,也就是接口类型,或者枚举类型。
Type t = Test.class.getDeclaredField("list").getGenericType();
System.out.println();
if (ParameterizedType.class.isAssignableFrom(t.getClass())) {
for (Type t1:((ParameterizedType)t).getActualTypeArguments()) {
System.out.print(t1 + ",");
}
System.out.println();
}
}