黑马程序员技术交流社区

标题: 如何获取对象内的泛型信息 [打印本页]

作者: sanguodouble1    时间: 2014-4-22 14:35
标题: 如何获取对象内的泛型信息
先回忆了一下以前学过的内容,就是获取泛型的几种方法,直接用代码表示把,直接一点
  1. package ProxyGenericText;

  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.ParameterizedType;
  4. import java.lang.reflect.Type;
  5. import java.util.ArrayList;
  6. import java.util.List;

  7. public class Test1 {
  8.         public static void main(String[] args) throws Exception {
  9.                 //第一种方法,用方法上的参数来获取泛型
  10.                 Class c1 = Test1.class;
  11.                 Method m = c1.getMethod("mm", List.class);
  12.                 Type[] types = m.getGenericParameterTypes();
  13.                 ParameterizedType pt = (ParameterizedType)types[0];
  14.                 System.out.println("原类型"+pt.getRawType());
  15.                 Type[] types1 = pt.getActualTypeArguments();
  16.                 System.out.println("实际类型" +types1[0]);
  17. System.out.println("第二种形式,类的参数化------");
  18.                 //第二种方法,用类申明上的信息来获取泛型
  19.                 MyList my = new MyList();
  20.                 Class c2 = my.getClass();
  21.                 Type t2 = c2.getGenericSuperclass();
  22.                 ParameterizedType pt2 = (ParameterizedType)t2;
  23.                 Type[] types2 = pt2.getActualTypeArguments();
  24.                
  25.                 System.out.println("原类型" +pt2.getRawType());
  26.                 System.out.println("实际类型1"+t2);
  27.                 System.out.println("实际类型2"+types2[0]);
  28.          }

  29.         public static void mm(List<Integer> lt) {
  30.                
  31.         }
  32. }

  33. class MyList extends ArrayList<Long> {
  34.         
  35. }
复制代码

现在又有一个问题了,如果我现在只是有一个对象a,但我不知道他的类申明语句。比如说,ArrayList<String> a = new ArrayList<String>();
我现在仅仅只是有一个对象a,我该如果获取他身上的泛型信息呢?


作者: kuroro自走核炮    时间: 2014-4-23 08:10
  1. import java.util.*;
  2. import java.lang.reflect.*;

  3. class Demo4
  4. {
  5.         ArrayList<String> a = new ArrayList<String>();
  6.         public static void main(String[] args)throws Exceptio
  7.         {
  8.                 // 获取Class实例   
  9.         Class<Demo4> class1 = Demo4.class;   
  10.         // 根据属性名取得该属性对应的Field对象   
  11.         Field aField = class1.getDeclaredField("a");   
  12.         // 直接通过getType()取出Field的类型,只对普通类型的Field有效   
  13.         Class<?> class2 = aField.getType();   
  14.         // 输出查看   
  15.         System.out.println("属性名为map的属性类型为:"+class2);   
  16.         }
  17. }
复制代码

作者: sanguodouble1    时间: 2014-4-23 08:49
kuroro自走核炮 发表于 2014-4-23 08:10

神一样的人,请问你在回答些什么?
我问的是何如获取对象a的泛型信息,你在获取什么?a的类型?

还有,我是说在不知道a是什么泛型的情况下获取a的泛型,(比如别人给你一个集合,这个集合里有a这个对象,现在你要获取a对象所对应的类的泛型信息
你如果直接申明了一个ArrayList<String> a ,那还用获取吗?
作者: kuroro自走核炮    时间: 2014-4-23 09:04
sanguodouble1 发表于 2014-4-23 08:49
神一样的人,请问你在回答些什么?
我问的是何如获取对象a的泛型信息,你在获取什么?a的类型?

哦,不好意思看差了,我看成是要在知道对象名的时候获取对象的类型是啥的问题了。

作者: sanguodouble1    时间: 2014-4-23 21:56
没人?????????????
作者: sanguodouble1    时间: 2014-4-24 08:33
人都去哪了?
作者: eternallove    时间: 2014-4-24 23:16
public class GenericTest   
        {   
            public ArrayList<String> a = new ArrayList<String>();
          
            public static void main(String[] args) throws SecurityException, NoSuchFieldException   
            {   
                ParameterizedType pt = (ParameterizedType) GenericTest.class.getField(   
                        "a").getGenericType();   
                System.out.println(pt.getActualTypeArguments()[0]);   
            }   
        }  
输出:class java.lang.String
作者: sanguodouble1    时间: 2014-4-25 08:35
eternallove 发表于 2014-4-24 23:16
public class GenericTest   
        {   
            public ArrayList a = new ArrayList();

同三楼的解释:
我是说在不知道a是什么泛型的情况下获取a的泛型,(比如别人给你一个集合,这个集合里有a这个对象,现在你要获取a对象所对应的类的泛型信息
你如果直接申明了一个ArrayList<String> a ,那还用获取吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2