黑马程序员技术交流社区

标题: 求解反射的问题 [打印本页]

作者: mk7    时间: 2013-6-8 17:37
标题: 求解反射的问题
本帖最后由 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??

作者: 007诸葛亮    时间: 2013-6-8 17:50
Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

作者: slatop@qq.com    时间: 2013-6-8 18:04
 因为你必须要指定一个对象,他才知道你要调用的是哪个对象的方法。虽然每个对象的方法都一样,但是方法操作的变量不一样。就如同你上面说的,getAge()如果不指定一个对象,那么你让他get谁的Age呢?

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

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

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

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

 
作者: java.exe    时间: 2013-6-8 18:11
所有的Person类的实例对象的getAge()方法是一样的没错,但是具体是哪个对象在调用这个方法就不一定了,通过反射你拿到的方法是类中的方法而不是某个对象中的方法,所以必须传进p,来说明是哪个对象在调用这个共享的方法
作者: 刘凯    时间: 2013-6-8 18:18
method.invoke(p, "lisi");
你这个代码本身就有写的有些问题  你这个是获取getAge方法啊,  get方法 还用传递“lisi”参数么?  应该是method.invoke(p); 吧
作者: mk7    时间: 2013-6-8 18:28
是的  我看到视频中有两个参数  于是也传了个"lisi”




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