在Spring的自动注入的源码中,我遇到了内省(Introspector),Spring会先找到全部的set和is方法,然后执行这些set和is方法注入属性。
如何找到这些set,is方法,JDK提供了内省(Introspector)API。
先看一个案例:
public class Bean {
int age;
String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Bean{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class MyIntrospector {
public static void main(String[] args) {
try {
Bean bean = new Bean();
BeanInfo beanInfo = Introspector.getBeanInfo(Bean.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; i++) {
Method writeMethod = propertyDescriptors[i].getWriteMethod();
if (propertyDescriptors[i].getName().equals("age")) {
writeMethod.invoke(bean, 11);
}
if (propertyDescriptors[i].getName().equals("name")) {
writeMethod.invoke(bean, "丽丽");
}
}
System.out.println(bean);
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
从运行结果我们可以看到我们注入了属性。
分析:
代码中第一句:Introspector.getBeanInfo(Bean.class) 部分将你的对象变成一个BeanInfo。
BeanInfo 中存在几个比较重要的方法。
案例中使用了获取属性描述器的 getPropertyDescriptors(),该方法就是获取get/set/is 等描述属性的方法。
尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili