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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 一碗小米周 于 2013-9-8 17:15 编辑

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

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

捕获.PNG

评分

参与人数 1技术分 +1 收起 理由
特殊服务 + 1

查看全部评分

6 个回复

正序浏览
一碗小米周 发表于 2013-9-8 16:10
恩。谢谢你。我已经发现了。请问怎么设置问题已解决呢?

把你的鼠标放在你的帖子的下面  点“编辑”  就可以了 呵呵 恩 会了就好
回复 使用道具 举报
张歆明 发表于 2013-9-8 15:57
楼主注意啊 我的理解是:
一定要把你的反射进行的操作对应到传统的方式:【如果自己搞不定的时候】
Method  ...

恩。谢谢你。我已经发现了。请问怎么设置问题已解决呢?
回复 使用道具 举报
楼主注意啊 我的理解是:
一定要把你的反射进行的操作对应到传统的方式:【如果自己搞不定的时候】
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的源码是:
  • public void println(Object x) {  
  •    String s = String.valueOf(x);  
  •    synchronized (this) {  
  •        print(s);  
  •         newLine();  
  •     }  
  • }





valueOf源码:
  • public static String valueOf(Object obj) {  
  •     return (obj == null) ? "null" : obj.toString();  
  • }



这样最后传入的(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);






评分

参与人数 1技术分 +1 收起 理由
张智文 + 1 赞一个!

查看全部评分

回复 使用道具 举报
一碗小米周 发表于 2013-9-8 15:48
恩。谢谢你。我刚刚在看视频的时候突然想到,在那个Set()方法中是没有return的。我刚刚在set()中添加了 ...

楼主准备进那期呢?我想进25,还木有面试,呜呜
回复 使用道具 举报
★忙碌★ 发表于 2013-9-8 15:43
methodSetX.invoke(pt,8)没有返回值,用RetVal2接收,当然接收到的值也是null
好好看看方法的返回值!上面 ...

恩。谢谢你。我刚刚在看视频的时候突然想到,在那个Set()方法中是没有return的。我刚刚在set()中添加了一个return语句就行了。
回复 使用道具 举报
methodSetX.invoke(pt,8)没有返回值,用RetVal2接收,当然接收到的值也是null
好好看看方法的返回值!上面这个方法调用后,是给pt的x属性设值,所以可以调用pt.getX();获取x 的值
希望对你有帮助
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马