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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mk7 中级黑马   /  2013-6-8 17:37  /  1552 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 mk7 于 2013-6-8 18:29 编辑

初学反射比较迷惑,希望大家指点

  1. 1,Person p = new Person();
  2. 2,Class clazz = Class.forName("com.itheima.Person");
  3. 3,Method method = clazz.getMethod("getAge", String.class);
  4. 4,method.invoke(p, "lisi");
复制代码
第3行代码获取了Person类中的getAge方法,所有Person实例对象的getAge方法不都是一样的吗  
为什么第4行代码中调用invoke方法还要传入一个Person类的实例对象p??

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1

查看全部评分

5 个回复

倒序浏览
Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
回复 使用道具 举报
 因为你必须要指定一个对象,他才知道你要调用的是哪个对象的方法。虽然每个对象的方法都一样,但是方法操作的变量不一样。就如同你上面说的,getAge()如果不指定一个对象,那么你让他get谁的Age呢?

 你换一个角度来思考这个问题。

 静态成员反射如下
 method.invoke(null,实参);

 因为是静态成员函数所以该函数只能调用静态成员,所以不用指定对象了。

 你将类与对象的关系理解的不够深刻,你要想象,对象是类的扩散体,一个类可以对应无数个对象,就好像类是一个中心,而向类四周扩散出的线都是他的对象。类拥有的东西,对象全部都有。

 

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
所有的Person类的实例对象的getAge()方法是一样的没错,但是具体是哪个对象在调用这个方法就不一定了,通过反射你拿到的方法是类中的方法而不是某个对象中的方法,所以必须传进p,来说明是哪个对象在调用这个共享的方法

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
method.invoke(p, "lisi");
你这个代码本身就有写的有些问题  你这个是获取getAge方法啊,  get方法 还用传递“lisi”参数么?  应该是method.invoke(p); 吧
回复 使用道具 举报
是的  我看到视频中有两个参数  于是也传了个"lisi”
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马