A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏晓彤 中级黑马   /  2013-3-9 14:34  /  1949 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面是通过反射获得泛型的参数化类型的代码
  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都知道这个方法名字了我找到这个方法不就知道它的参数化类型了吗。用得着这么麻烦,通过反射把它找出来。感觉没用
谁能告诉我 通过反射获得泛型的参数化类型的用武之地

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
Method Class.getDeclaredMethod(String name, Class<?>... parameterTypes)
          返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
这是一个获得private方法对象的方法,即使知道该方法名字,我们也无法直接确定其返回值类型和参数列表(private)。必须通过反射和传入的参数来获取到这个方法的一个对象,再对这个方法对象进行操作达到我们的目的。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
沈文杰 发表于 2013-3-9 15:31
Method Class.getDeclaredMethod(String name, Class... parameterTypes)
          返回一个 Method 对象 ...

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

因为是私有的。。是不能直接获取到的
回复 使用道具 举报
通过反射可以动态的获取一些你预先并不知道的类的方法和信息,也就是说只有通过反射你才可以获取到这些信息,所以在这种情况下,如果不使用反射你是没办法得到它的参数的
回复 使用道具 举报
夏晓彤 发表于 2013-3-9 16:24
我就是对这句不理解“即使知道该方法名字,我们也无法直接确定其返回值类型和参数列表(private)“
为什么 ...

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