黑马程序员技术交流社区

标题: 内省 [打印本页]

作者: 史晓霞    时间: 2011-11-10 09:28
标题: 内省
内省和javaBean什么关系
作者: 郭敏    时间: 2011-11-10 09:41
我认为,内省主要用来对javaBean中的成员变量进行Get / Set 操作,因为在开发框架过程中,经常需要使用Java对象的属性来封装程序的数据,如果每次都使用反射技术完成此操作过于麻烦,所又才有了内省的出现。
作者: 贺洪京    时间: 2011-11-10 09:50
它们之间的关系其实就可以认为是普通类和反射之间的关系,内省只是专门作用于javabean的
JavaBean的内省就是对JavaBean中的属性和事件的一些处理方法,通过setName和getName去访问和设置name的值。Java中通过Introspector类的getBeanInfo(beanClass)静态方法,获得JavaBean的BeanInfo集合,再遍历BeanInfo集合来得到JavaBean的某一个属性的属性描述器(PropertyDescriptor),利用PropertyDescriptor得到JavaBean中属性的get和set方法。

例如:
BeanInfo beanInfo = Introspector.getBeanInfo(Student.class);
  PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
  Student student=new Student();
  for(PropertyDescriptor pd1:pds){
   if(pd1.getName().equals("laozhang")){
    Method method3 = pd1.getReadMethod();
    System.out.println(method3.invoke(student));
    Method method4 = pd1.getWriteMethod();
    method4.invoke(student, "laoli");
    System.out.println(method3.invoke(student));
    System.out.println(pd1.getName());
   }
  }
我也就懂这些希望能帮助你!!!

作者: 史晓霞    时间: 2011-11-10 09:52
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省,下面有代码:
如果用内省:
ReflectPoint pt=new ReflectPoint(3,5);
String propertyName="x";
PropertyDescriptor pd=new PropertyDescriptor(propertyName,pt.getClass());
Method methodGetX=pd.getReadMethod();
Object retVal=methodGetX.invoke(pt);
System.out.println(retVal);
但是下面的代码不是更简单呢
ReflectPoint pt=new ReflectPoint(3,5);
System.out.println(pt.getX());

它们的区别是什么?

作者: 贺洪京    时间: 2011-11-10 10:03
它们之间运行的结果没有什么区别,如果你不做框架,你根本就用不到内省还有java的反射技术,这些技术主要是用作开发框架的时候,比如,在javaWEB开发中,我们要想使用Hibernate框架来进行关系与对象的映射时,就必须要配置相应的Xml文件,我们配置好以后,框架的内部实现原理就是,它首先会去解析这个Xml文档,当它解析到配置的数据以后,这些数据包括你配置的javaBean的名字还有属性等,它就会拿着这些数据去内省你的javaBean来做出相应的操作,这时候如果不使用内省的话,它根本就无法访问到你javabean里的东西,我们知道一个类中的成员是不允许外界的对象来访问的。这样说不知道你明不明白。
作者: 郭敏    时间: 2011-11-10 10:04
那你就先记着内省的功能,等以后学到框架时,你就会了解!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2