黑马程序员技术交流社区

标题: 关于张孝祥老师讲的一个javaBean中一个小问题 [打印本页]

作者: 一碗小米周    时间: 2013-9-8 13:49
标题: 关于张孝祥老师讲的一个javaBean中一个小问题
本帖最后由 一碗小米周 于 2013-9-8 17:15 编辑

请问各位,为什么当设置x的值为8时,输出语句用system.out.println(RetVal2)为null. 而用pt.getX则为8.有谁知道的指点一下啊。谢谢各位了。

捕获.PNG (44.81 KB, 下载次数: 31)

捕获.PNG

作者: ★忙碌★    时间: 2013-9-8 15:43
methodSetX.invoke(pt,8)没有返回值,用RetVal2接收,当然接收到的值也是null
好好看看方法的返回值!上面这个方法调用后,是给pt的x属性设值,所以可以调用pt.getX();获取x 的值
希望对你有帮助
作者: 一碗小米周    时间: 2013-9-8 15:48
★忙碌★ 发表于 2013-9-8 15:43
methodSetX.invoke(pt,8)没有返回值,用RetVal2接收,当然接收到的值也是null
好好看看方法的返回值!上面 ...

恩。谢谢你。我刚刚在看视频的时候突然想到,在那个Set()方法中是没有return的。我刚刚在set()中添加了一个return语句就行了。

作者: ★忙碌★    时间: 2013-9-8 15:56
一碗小米周 发表于 2013-9-8 15:48
恩。谢谢你。我刚刚在看视频的时候突然想到,在那个Set()方法中是没有return的。我刚刚在set()中添加了 ...

楼主准备进那期呢?我想进25,还木有面试,呜呜

作者: 张歆明    时间: 2013-9-8 15:57
楼主注意啊 我的理解是:
一定要把你的反射进行的操作对应到传统的方式:【如果自己搞不定的时候】
Method methodSetX =pd.getWriteMethod();
Object retVal2 =methodSetX.invoke(pt1, setVal);
System.out.println(retVal2);


{1}:Method methodSetX 是不是属性名“x”的Setter?
{2}:Object retVal2 =methodSetX.invoke(pt1, setVal);
调用的是不是对象pt1的属性x的Setter方法,也就是JavaBean中的setX()方法

回到你的JavaBeab中观察一下这个setX方法的原型:
public void setX(int x) {
        this.x = x;
}



这个方法的返回值不是void么?


这样如果非要用Object retVal2来接受这个void的返回值,就会返回一个null【因为invoke方法的原型返回值类型就是Object】
现在这个方法的返回值类型是空 void  ----- >就会被对应成null


所以 这个时候  retVal的值就是(Object)null
println的源码是:





valueOf源码:



这样最后传入的(Object)null就会被println中调用的valueOf方法转换成字符串“null”并连同换行符一同打印出来   所以打印出来的是null


*****************************修正*****************************
pt.getX可以获取到8 是因为执行的不是Setter而是Getter

所以 要通过反射获取这个值,应该这样写:先通过反射设置这个值 再通过反射获取这个值再打印


Method methodSetX =pd.getWriteMethod();
methodSetX.invoke(pt1, setVal);


Method methodGetX =pd.getReadMethod();
Object retVal =methodGetX.invoke(pt1, null); //执行的是pt1.getX()  getX()返回的是int  所以自然可以打印出来值

System.out.println(retVal);







作者: 一碗小米周    时间: 2013-9-8 16:10
张歆明 发表于 2013-9-8 15:57
楼主注意啊 我的理解是:
一定要把你的反射进行的操作对应到传统的方式:【如果自己搞不定的时候】
Method  ...

恩。谢谢你。我已经发现了。请问怎么设置问题已解决呢?

作者: 张歆明    时间: 2013-9-8 16:24
一碗小米周 发表于 2013-9-8 16:10
恩。谢谢你。我已经发现了。请问怎么设置问题已解决呢?

把你的鼠标放在你的帖子的下面  点“编辑”  就可以了 呵呵 恩 会了就好





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