楼主注意啊 我的理解是:
一定要把你的反射进行的操作对应到传统的方式:【如果自己搞不定的时候】
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);
|