JavaSE学习笔记--内省

来源:互联网 发布:纸模型高达 知乎 编辑:程序博客网 时间:2024/05/17 01:56


内省

 

内省是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类不同)