黑马程序员技术交流社区

标题: 通过反射获得泛型的参数化类型问题 [打印本页]

作者: 夏晓彤    时间: 2013-3-9 14:34
标题: 通过反射获得泛型的参数化类型问题
下面是通过反射获得泛型的参数化类型的代码
  1. public class GenericalReflection {

  2.          public static void main(String[] args)throws Exception{
  3.          Method methodApply = GenericalReflection.class.getDeclaredMethod("setDates", Vector.class);
  4.          ParameterizedType pType = (ParameterizedType)(methodApply.getGenericParameterTypes())[0];
  5.                   System.out.println("setDates("
  6.                           + ((Class) pType.getRawType()).getName() + "<"
  7.                           + ((Class) (pType.getActualTypeArguments()[0])).getName()
  8.                           + ">)" );
  9.         }
  10.          private Vector<Date> dates = new Vector<Date>();
  11.          public void setDates(Vector<Date> dates) {
  12.            this.dates = dates;
  13.          }/*getGenericParameterTypes()得到原始参数类型,返回是Class对象,
  14. setDates(class java.util.Vector<java.util.Date>)
  15. 而使用了后打印的是setDates(java.util.Vector),了
  16. getActualTypeArguments()方法是得到实例化类型参数的类型,一看到s就知道是数组,getActualTypeArguments()[0]就是第一个参数的类型*/

  17. }
复制代码
问题
Method methodApply = GenericalReflection.class.getDeclaredMethod("setDates", Vector.class);
得到某个方法的字节码对象,必须要知道这个方法的名字,既然我要知道这个方法里的参数化类型,既然i都知道这个方法名字了我找到这个方法不就知道它的参数化类型了吗。用得着这么麻烦,通过反射把它找出来。感觉没用
谁能告诉我 通过反射获得泛型的参数化类型的用武之地
作者: 沈文杰    时间: 2013-3-9 15:31
Method Class.getDeclaredMethod(String name, Class<?>... parameterTypes)
          返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
这是一个获得private方法对象的方法,即使知道该方法名字,我们也无法直接确定其返回值类型和参数列表(private)。必须通过反射和传入的参数来获取到这个方法的一个对象,再对这个方法对象进行操作达到我们的目的。
作者: 夏晓彤    时间: 2013-3-9 16:24
沈文杰 发表于 2013-3-9 15:31
Method Class.getDeclaredMethod(String name, Class... parameterTypes)
          返回一个 Method 对象 ...

我就是对这句不理解“即使知道该方法名字,我们也无法直接确定其返回值类型和参数列表(private)“
为什么可以知道方法名不能知道其返回值类型和参数列表(private)
作者: 沈文杰    时间: 2013-3-9 17:57
夏晓彤 发表于 2013-3-9 16:24
我就是对这句不理解“即使知道该方法名字,我们也无法直接确定其返回值类型和参数列表(private)“
为什么 ...

对于一般私有方法,这个类中会预留一个public 的方法作为入口。一般规范化的java程序,成员变量都是private保护,然后用的时候public预留出去。private 是继承不了的。private就是为了不让你创建对象时直接用的。当我们在其他的public方法中发现调用该private方法,就可以知道名字,然后使用反射得到这个方法的一个对象。




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