2.对JavaBean的操作
[java] view plaincopyprint?
package com.JavaSE.IntroSpector;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
//对象JavaBean的简单内省操作(简单方便:PropertyDescriptor)和复杂操作(稍微复杂点:IntroSpector)
//通过内省来操纵JavaBean,通过PropertyDescriptor类才操作,调用该类时也是用的反射
public class IntroSpectorTest {
/**
* 1.创建PropertyDescriptor对象
* 2.获取JavaBean的方法对象
* 3.通过方法对象获取属性值
* 4.修改属性值
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Point p1 = new Point(3,5);//JavaBean Point
//获取JavaBean的属性
Object value = getProperties(p1);
System.out.println(value);
//设置JavaBean的属性(简单方式:PropertyDescriptor)
Object y = 7;//所修改属性的值
setPropertiesEasy(p1, y);
System.out.println(p1.getY());
//设置JavaBean的属性(复杂方式:IntroSpector)
setPropertiesComplex(p1,y);
System.out.println(p1.getY());
}
private static Object getProperties(Point p1) throws Exception{
//1.创建PropertyDescriptor对象,通过属性名和类的字节码初始化一个PropertyDescriptor对象
PropertyDescriptor pd = new PropertyDescriptor("x", p1.getClass());
//2.获取JavaBean的方法对象,通过属性名获取JavaBean的方法对象(读)
Method methodX = pd.getReadMethod();
//3.通过方法对象获取属性值
Object retVal = methodX.invoke(p1);
return retVal;
}
private static void setPropertiesEasy(Object p1, Object y) throws Exception{//简单方式
PropertyDescriptor pd = new PropertyDescriptor("y", p1.getClass());//通过属性名和类的字节码初始化一个PropertyDescriptor对象
Method methodSetY = pd.getWriteMethod();//通过属性名获取JavaBean的方法对象(写)
methodSetY.invoke(p1, y);//修改属性值
}
private static void setPropertiesComplex(Object p1, Object y) throws Exception{//复杂内省操作JavaBean
//1.通过Introspector.getBeanInfo()方法获取bean的对象(BeanInfo),传递JavaBean的字节码参数
BeanInfo beanInfo = Introspector.getBeanInfo(p1.getClass());
//2.获取到BeanInfo之后获得所有的JavaBean的Properties
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
//3.通过迭代、反射来修改JavaBean的属性
for(PropertyDescriptor pd : pds){
if(pd.getName().equals("y")){//匹配属性值
Method methodSetY = pd.getWriteMethod();
methodSetY.invoke(p1, 10);
}
}
}
} |