package cn.itcast.day2012o804;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class JavaBeanTest {
public static void main(String[] args) {
ReflectPointt pt1 = new ReflectPointt(3,5);//实例化对象
String propertyName = "y";
Object value = 7;
setProperty(pt1,propertyName,value);//设置这个设置JavaBean类的y属性
System.out.println(pt1.getY());//验证setProperty(pt1,propertyName,value)是否设置成功
}
private static void setProperty(Object pt1, String propertyName,
Object value) {
try {
/* 你的问题:
* 通过Introspector类的getBeanInfo方法,可以得到一个BeanInfo对象,但是这个对象是个接口对象,
* 而且既然通过BeanInfo对象,还能调用这个接口里面的一些方法,比如getMethodDescriptors() ,
* getPropertyDescriptors() ,接口里面不都是抽象的、并且没有方法体的方法吗,那调用BeanInfo
* 里面的方法,是怎么调用的?
*
* 回答:BeanInfo是一个接口,但在这里 已经被实现了,用的是多态原理
* 如: Set set = new ArryList();
* Set 是一个接口吧 :public interface Set
* 但它被实现了,所以就可以那样写了
*
*/
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//找到所有符合JavaBean的方法
for(PropertyDescriptor pd :pds){
if(pd.getName().equals(propertyName)){ //判断是否有 y的方法
pd.getWriteMethod().invoke(pt1,value);//调用getY的方法
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//一个标准的JavaBean类
class ReflectPointt
{
private int x ;
private int y ;
public ReflectPointt(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
} |