以下是我在CSDN博客上看到的
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
内省主要用于对JavaBean进行操作
JavaBean是一个特殊的Java类,其中某些方法符合某种命名的规则
例:int getAge()
void setAge(int age) //set,get特定的规则,用于外界的操作
基本格式:
class Person{
private int x;
public int getAge(){
return x;
}
public void setAge(int age){
this.x = age;
}
}
Person类 里面有 set,get方法,Person类就可以当做JavaBean进行操作,则它里面就有一个Age名称的属性,因为x是私有的,外部只能通过setAge,getAge进行操作。
JavaBean中去掉set,get的方法名,剩下的名称就是JavaBean的属性名,JavaBean的属性名有个规则:如果第二个字母是小的,则把第一个字母变成小的。则上面Person类作为JavaBean的属性为 age。
例:gettime属性为 time; getTime属性为time; getCPU 属性为CPU
对JavaBean的简单内省操作
如果一个类符合JavaBean的特点,那它可以当做普通的类来处理,还可以当做JavaBean来处理
例1:使用内省对JavaBean操作
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class ReflectIntroSpector2{
public static void main(String args[])throws Exception{
ReflectPoint pt1 = new ReflectPoint(3,5);
//利用JavaBean获取一个值
String propertyName = "x";
Object retVal = getProperty(pt1,propertyName);
System.out.println(retVal);//3
//利用JavaBean设置一个值
Object value = 7;
setProperty(pt1,propertyName,value);
System.out.println(pt1.getX());//7
}
//重构处理JavaBean的方法
private static Object getProperty(Object pt1,String propertyName)throws Exception{
//获取传过来对象的传过来的值
PropertyDescriptor pd = newPropertyDescriptor(propertyName,pt1.getClass());
//PropertyDescriptor类,属性描述符
//第一个参数是属性名,第二个参数是要当做JavaBean的类
Method methodGetX = pd.getReadMethod();
//获取JavaBean的只读方法,即X属性的读,get方法
Object retVal = methodGetX.invoke(pt1);
//第一个参数是指在pt1上面调用,因为调用时get方法不接受参数,所以第二个参数没有
return retVal;
}
private static void setProperty(Object pt1,String propertyName,Object value)throws Exception{
PropertyDescriptor pd = newPropertyDescriptor(propertyName,pt1.getClass()); //可与上面的共用
Method methodSetX = pd.getWriteMethod();
//获取JavaBean的写入方法,即X属性的写,set方法
methodSetX.invoke(pt1,value);
//第一个参数是指在pt1上面操作,因为set方法要传递一个参数,第二个参数的是传递个set方法的值value,也就是设置为7,7应该为Integer类型,但1.5有自动打包解包
//因为set方法无返回值,所以不需要接受
}
}
class ReflectPoint {
private int x;
private int y;
public ReflectPoint(int x,int y){
super();
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;
}
}
对JavaBean的复杂内省操作
IntroSpector类的静态方法getBeanInfo方法,返回BeanInfo对象,就是把这个类当作JavaBean看的结果信息。然后遍历BeanInfo的所有属性方式,查找和设置某个JavaBean对象的属性。
比如有一个集合,可以从集合中查找某个特定的元素
例3:修改上例,使用getBeanInfo方法
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.beans.BeanInfo;
import java.beans.Introspector;
public class ReflectBeanInfo{
public static void main(String args[])throws Exception{
ReflectPoint pt1 = new ReflectPoint(3,5);
//利用JavaBean获取一个值
String propertyName = "x";
Object retVal = getProperty(pt1, propertyName);
System.out.println(retVal);//3
//利用JavaBean设置一个值
Object value = 7;
setProperty(pt1, propertyName, value);
System.out.println(pt1.getX());//7
}
//重构处理JavaBean的方法
private static Object getProperty(Object pt1,String propertyName)throws Exception{
//获取传过来对象的传过来的值
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
//将获取的作为JavaBean类的class文件转为BeanInfo,BeanInfo代表了JavaBean的信息
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
//BeanInfo 只能得到所有的属性描述,不能指定单个的,所以只能放在数组里面
Object retVal = null;
for(PropertyDescriptor pd : pds){//对属性数组进行迭代
if(pd.getName().equals(propertyName)){//将获取每一个属性的名字,与要查找的属性进行比较
Method methodGetX = pd.getReadMethod();
retVal = methodGetX.invoke(pt1);
break;
}
}
return retVal;
}
private static void setProperty(Object pt1, String propertyName, Object value)throws Exception{
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd : pds){
if(pd.getName().equals(propertyName)){
Method methodSetX = pd.getWriteMethod();
methodSetX.invoke(pt1,7);
break;
}
}
}
}
|