黑马程序员技术交流社区

标题: 我们为什么我用内省,他的作用是什么?? [打印本页]

作者: 江南雨    时间: 2013-6-12 15:05
标题: 我们为什么我用内省,他的作用是什么??
本帖最后由 江南雨 于 2013-6-12 20:23 编辑

看视频看不懂,知道是这么一回事,但是就是不知道它有什么用。能举个例子就最好了!!
作者: 许聪聪    时间: 2013-6-12 17:52
有点长,希望楼主能仔细观看
首先:内省,主要操作JavaBean的.

JavaBean是一个特殊的Java类,
方法打头一定要是get,或者set

对JavaBean的简单内省操作

-------补充:..
内省访问JavaBean属性的两种方式:
通过PropertyDescriptor类操作Bean的属性
通过Instospector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),
通过这个属性描述其就可以获取某个属性对应的getter/setter方法,然后通过反射机制调用这些方法.

内省-beanutils工具包
Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单易用的API操作Bean的属性-->BeanUtils
工具包内常用的类
BeanUtils
PropertyUtils
ConvertUtils.regsiter(Converter convert,Class clazz)
------补充结束
需求:用内省的方式来读取JavaBean的x属性.

PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。
PropertyDescriptor(String propertyName, Class<?> beanClass)
          通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。

  1. //需求:用内省的方式来读取JavaBean的x属性.
  2. import java.beans.IntrospectionException;
  3. import java.beans.PropertyDescriptor;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;

  6. public class IntroSpectorTest {
  7.         public static void main(String[] args)throws Exception
  8.         {
  9.                 ReflectPoint pt1 = new ReflectPoint(3,4);
  10.                
  11.                 String propertyName = "x";
  12.                 //普通方法:"x"-->"X"-->"getX"-->"Method getX"-->得到值
  13.                
  14.                 //内省的方法:PropertyDescriptor(属性名,JavaBean类),属性描述符
  15.                 Object retVal = getProperty(pt1, propertyName);
  16.                 System.out.println(retVal);
  17.                
  18.                 //接下来,set一个值
  19.                 Object value = 1;
  20.                
  21.                 setProperty(pt1, propertyName, value);
  22.                 System.out.println(pt1.getX());

  23.         }

  24.         private static Object getProperty(Object pt1, String propertyName)
  25.                         throws IntrospectionException, IllegalAccessException,
  26.                         InvocationTargetException {
  27.                                            //PropertyDescriptor(属性名,JavaBean类),属性描述符
  28.                 PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,pt1.getClass());
  29.                 Method methodGetX=pd1.getReadMethod();
  30.                 Object retVal = methodGetX.invoke(pt1);
  31.                 return retVal;
  32.         }

  33.         private static void setProperty(Object pt1, String propertyName,
  34.                         Object value) throws IntrospectionException,
  35.                         IllegalAccessException, InvocationTargetException {
  36.                 PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass());
  37.                 Method methodSetX = pd2.getWriteMethod();
  38.                 methodSetX.invoke(pt1,value);
  39.         }

  40. }
复制代码
对JavaBean的复杂内省操作

采用遍历BeanInfo的所有属性方法来查找和设置某个ReflectPoint对象的x属性.
在程序中把一个类当做JavaBean来看,就是调用了IntroSpector.getBeanInfo方法,
得到的BeanInfo对象封装了把这个类当做JavaBean的结果信息.
  1. //获取值
  2.         private static Object getProperty(Object pt1, String propertyName)
  3.                         throws IntrospectionException, IllegalAccessException,
  4.                         InvocationTargetException {
  5.                 /*
  6.                 PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,pt1.getClass());
  7.                 Method methodGetX=pd1.getReadMethod();
  8.                 Object retVal = methodGetX.invoke(pt1);
  9.                 return retVal;
  10.                 */
  11.                 //比较复杂的方式
  12.                 BeanInfo beanInfor = Introspector.getBeanInfo(pt1.getClass());
  13.                 PropertyDescriptor[] pds = beanInfor.getPropertyDescriptors();
  14.                 Object retVal = null;
  15.                 for(PropertyDescriptor pd : pds)
  16.                 {
  17.                         if(pd.getName().equals(propertyName))
  18.                         {
  19.                                 Method methodGetX = pd.getReadMethod();
  20.                                 retVal = methodGetX.invoke(pt1);
  21.                                 break;
  22.                         }
  23.                 }
  24.                 return retVal;       
  25.         }
复制代码
希望对楼主有用.





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