尝试解析上一篇blog的一个小例子,加深理解。
public class PropertyTest {
public static void main(String[] args) {
TestModel tm = new TestModel();
BeanWrapper bw = new BeanWrapperImpl(tm);
bw.setPropertyValue("good","on");
System.out.println(tm);
}
}
![](https://img.haomeiwen.com/i2189522/09249a5a24e84936.png)
走完了nestedPa.setPropertyValue(tokens, new PropertyValue(propertyName, value));
,从上图中可以看到rootObject
的good
属性被赋值了true
。然后尝试进入nestedPa.setPropertyValue(tokens, new PropertyValue(propertyName, value));
,可以发现下面这张图片。
![](https://img.haomeiwen.com/i2189522/6df52f7c6fa51165.png)
从上图中可以看到tm
对象的引用在this.wrappedObject
里面,而将on
转化过的true
在变量valueToApply
中。然后在进入到函数convertForProperty()
中。最后辗转找到下面这个函数。
![](https://img.haomeiwen.com/i2189522/ffe5378de747cafc.png)
从上图中可以发现传递过来的参数是
- propertyName:"good",是要设置值的属性名字。
- oldValue:null,是指原来这个对象中的
good
属性值是null。 - newValue:"on",是指现在新的值需要设置为
on
。 - requiredType:"boolean",是指现在这个叫做
good
的属性值的类型是boolean
。 - typeDescriptor:"boolean",是指
![](https://img.haomeiwen.com/i2189522/29b2312b8d667b07.png)
在函数
convertIfNecessary
里面发现最后返回的参数是convertedValue
,所以在上图这里的时候convertedValue
还是on
,但是这个函数过了之后就是true
了。所以这个函数里面就有类型转换的代码了。
![](https://img.haomeiwen.com/i2189522/f57a89c802b9d58b.png)
从上图中可以看到当convertedValue
是String
类型的时候,正好on
是String类型的,会调用doConvertedTextValue
函数。虽然这里convertedValue
是个Object
的,但是instanceof
还是能够判断出来这个Object
里面的变量是值是String
类型的。
![](https://img.haomeiwen.com/i2189522/92c3b6e4c5741463.png)
外面那么多判断,终于进入了属性编辑器PropertyEditor的东西了,注意这里PropertyEditor的实例是CustomBooleanEditor,这里有个语句是editor.setAsText(newTextValue)
,所以查看CustomBooleanEditor的editor.setAsText(newTextValue)
。
![](https://img.haomeiwen.com/i2189522/b3de1571c2a21e27.png)
![](https://img.haomeiwen.com/i2189522/996afdbc97b8761b.png)
从上面两张图中可以发现当传入的字符串是on的时候,会设置内部的value的值为true。最后就是返回了,一层一层的返回。
![](https://img.haomeiwen.com/i2189522/8b9d065954892c51.png)
上图进入之后发现通过反射调用,将值设置进入到wrappedObject中。
![](https://img.haomeiwen.com/i2189522/a5475f051bf3e4f5.png)
![](https://img.haomeiwen.com/i2189522/5836a6bf28ba3b57.png)
从上面的两张图中可以发现首先在setValue()
函数中,得到需要调用的函数的名字是writeMethod
这个是个java.lang.reflect.Method
的,然后就可以正常调用反射的知识,将值设置进入变量中。
网友评论