比如:private List<String> name;用反射可以获得Field,getDeclaredField();
但是field的name是interface java.util.List. <String>不见了。但是好像只拿到了List,而不知道怎么拿到List里面的类型是什么,看了API也没找到。
我想要拿到List<String>,也就是要知道List里存的是什么类型的。
请教高手。

解决方案 »

  1.   

    http://www.javaeye.com/topic/585900http://www.javaeye.com/topic/585900public class GenericTest   
    {   
        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
      

  2.   

    研究一下泛型擦出虚拟机里只有List
      

  3.   

    很明确的说 想利用反射是获得不了泛型类型的,因为JVM编译的时候生成了两套字节码文件,而通过其中一套用于反射的,另一套是JVM真正运行使用的。不过别的方法或许行。
    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()); }
    }是不是感觉有点自欺欺人?呵呵
      

  4.   

    呃String.class是你传进去的,可是不一定就是String.class 可以是任何类型啊,比如我自己写的一个类
      

  5.   


    一楼那个因为class已经实例化了,泛型已经定型了。 如果还不明白,你可以把代码反编译就行了。
      

  6.   

    感觉不行
    java中的泛型不是真正意义上的泛型
    所以才有了类型擦除的概念
      

  7.   


    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>
      

  8.   

    java程序被编译后会记录一些泛型信息,但是前提是编译器已经明确的知道了属于什么类型如: List<String> list明确告诉编译器list里面的类型为String,所以类加载时会在保存字段信息包括泛型信息,所以可以通过反射读字段信息里面的泛型信息。但是没有指明明确类型如:
    List<?> list那字段信息包括泛型信息就是?,如果以后对实例进行赋值list = new ArrayList<String>
    读到数据还是?,因为类加载完毕后,一般的操作不会修改类信息。
      

  9.   


    java.util.List<java.lang.String>这个可以拿到,我知道,
    java.lang.String怎么拿到呢?
    不要解析字符串。
    另外,<>里的可能又是个List,也就是接口类型,或者枚举类型。
      

  10.   

    public static void main(String args[]) throws Exception{   
    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();        
            }    
    }