内省
内省是Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name, 那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则
class Person{
private int age;
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某些命名规范。
java的属性名是根据方法名而来的:去掉get或set的方法名前缀之后,剩下的名称就是javaBean的属性名。但是主要大小写的改写情况。
如:
getTime-->time
getCPU-->CPU
内省的操作:
使用内省来操作javaBean
获取java中字段的值,通常的方法:
1,使用反射的方法
"x"-->"X"-->"getX"-->MethodGetx-->
2,使用反射的方法
String propertyName = "x";
PropertyDescriptor pd = new PropertyDescriptor(propertyName,beanclass);
Method methodGetX = pd.getReadMethod();
Object retVal = methodGetX.invoke(Object obj,Object...args);
/*
pd.getWriteMethod();
methodSetX.invoke(Object obj,Object...args);
*/
使用Beanutils工具包来设置java类的属性:
使用前需要导入Beanutils工具包 和 Logging包。
ReflectPoint pt1 =new ReflectPoint(3,5);
BeanUtils.setProperty(pt1,"x","9"); //注意使用时x当作String类型的,而不是int
System.out.println(pt1.getX());
又如:(支持属性的"级延操作")
BeanUtils.setProperty(pt1,"birthday.time","111");birthday是一个复合属性,他下边还有一个time,因为birthday有一个setTime()方法。
System.out.println(BeanUtils.getProperty(pt1,"birthday.time"));birthday是一个复合属性,他下边还有一个time,因为birthday有一个setTime()方法。
使用PropertyUtils.setProperty(pt1,"x",9);
System.out.println(PropertyUtils.getProperty(pt1,"x").getClass()); //注意使用时x当作Int类型的,String.(与BeanUtils类不同)