自己想着实现一个简单点的类似Spring的beanFactory,解析下xml,通过反射调用相关的set方法来实现构建bean对象,其间遇到一个问题没找到比较好的解决方案。
现在有一个简单的bean:
public class MyBean
{
private int id;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
}
然后有一个简单的beans.xml
<beans>
<bean id="myBean" class="com.iss.bean.MyBean">
<property name="id" value="1"></property>
</bean>
</beans>
从xml解析得到一个属性value后,是字符串类型,然后要转换成set方法的参数类型,
但是如果编译时无法得知set参数的类型,就像spring那样在运行时动态获取类型动态转换,该如何实现。
也曾想过一个个比对,但是感觉太复杂,也许有简单点的方法。
然后开始艰辛地调试spring源码….
Spring在解析了xml之后会将所有属性值与属性名存储在对应bean的PropertyValues中,
该结构维护了一个List<PropertyValue> propertyValueList,而PropertyValue则维护着单个属性的属性名和属性值。
然后通过遍历该propertyValueList,将每一个待转换的类型进行判断并转换。
在获取到bean类和属性名后,spring通过该属性的get方法的返回类型或者set方法的参数类型得到属性类型,下面即获取类型
// org.springframework.beans .GenericTypeAwarePropertyDescriptor.class
public synchronized Class getPropertyType() {
if (this.propertyType == null) {
if (this.readMethod != null) {
this.propertyType = GenericTypeResolver.resolveReturnType(this.readMethod, this.beanClass);//这里的readMethod就是get方法
}
else {
MethodParameter writeMethodParam = getWriteMethodParameter();//获取到set方法的参数
if (writeMethodParam != null) {
this.propertyType = writeMethodParam.getParameterTyp