黑马程序员技术交流社区

标题: 19第一帖?先来个问题 [打印本页]

作者: 黑马潘浩    时间: 2013-3-27 12:45
标题: 19第一帖?先来个问题
本帖最后由 黑马潘浩 于 2013-3-27 16:11 编辑

内省操作到底指的是什么?
作者: 黄玉昆    时间: 2013-3-27 13:48
IntroSpector:即内省,是对内部进行检查,了解更多的底层细节。
内省的作用:主要针对JavaBean进行操作。
具体请看张老师的高新技术视频关于内省的讲解。
作者: 田磊阳    时间: 2013-3-27 13:51
JavaBean代码演示了简单内省操作以及复杂内省操作  。

1、简单内省操作
package me.test;
import java.lang.reflect.*;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
public class IntroSpectorTest
{
   public  static void main(String []args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
   {
    JavaBeanTest t=new JavaBeanTest() ;
    t.setX(10);
    PropertyDescriptor d=new PropertyDescriptor("X",JavaBeanTest.class);
    setProperty(t, d);
    Object val = getProperty(t, d);
    System.out.println(val);
   
   }
private static Object getProperty(JavaBeanTest t, PropertyDescriptor d)
  throws IllegalAccessException, InvocationTargetException {
Method mr=d.getReadMethod()  ;
    Object val=mr.invoke(t);
return val;
}
private static void setProperty(JavaBeanTest t, PropertyDescriptor d)
  throws IllegalAccessException, InvocationTargetException {
    Method mw=d.getWriteMethod()  ;
    mw.invoke(t, 5) ;
}
}
class  JavaBeanTest
{
private int x  ;
public void setX(int x)
{
  this.x=x ;
}
public int getX()
  
{
  return this.x ;
}
}


2、复杂内省操作   BeanInfo类   Introspector类的使用
package me.test;
import java.lang.reflect.*;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class IntroSpectorTest
{
   public  static void main(String []args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
   {
    JavaBeanTest t=new JavaBeanTest(10) ;
    PropertyDescriptor d=new PropertyDescriptor("x",JavaBeanTest.class);
    setProperty(t, d);
    Object val = getProperty(t, d);
    System.out.println(val);
   
   }
private static Object getProperty(JavaBeanTest t, PropertyDescriptor d)
  throws IllegalAccessException, InvocationTargetException, IntrospectionException {
    BeanInfo beanInfo=Introspector.getBeanInfo(t.getClass()) ;  
PropertyDescriptor  pt[]=beanInfo.getPropertyDescriptors() ;
  for(PropertyDescriptor tem:pt)
  {
   if(tem.getName().equals(d.getName()))
     {
             Method mr=tem.getReadMethod() ;
             Object val=mr.invoke(t) ;
             return val ;
     }
  }
return null;
}
private static void setProperty(JavaBeanTest t, PropertyDescriptor d)
  throws IllegalAccessException, InvocationTargetException, IntrospectionException {
   
    BeanInfo beanInfo=Introspector.getBeanInfo(t.getClass() ) ; //把JavaBeanTest的对象当做JavaBean看有什么信息封装在BeanInfo中
    PropertyDescriptor [] pd=beanInfo.getPropertyDescriptors() ;  //Get All Properties From BeanInfo Class
    for(PropertyDescriptor tem:pd)
    {  
     if(tem.getName().equals(d.getName()))
     {
      Method mw=tem.getWriteMethod() ;
      mw.invoke(t, 50)  ;
      break ;
     }
    }
}
}
class  JavaBeanTest
{
private int x  ;
public JavaBeanTest(int x)
{
  this.x=x ;
}
public void setX(int x)
{
  this.x=x ;
}
public int getX()
  
{
  return this.x ;
}
}
作者: 赵家阳    时间: 2013-3-27 13:56
      在java的反射中,所有的类被抽象出一个类,即Class类,这样我们就可以在程序运行的过程中通过配置文件,动态的加载类。但是在用反射的时候有些前提,就是:当我们调用有参的constructor的时候必须先知道构造函数传入的参数是什么类型;调用Method的时候必须先知道成员函数传入的参数是什么类型;调用field的时候必须先知道成员变量的类型。但是在某些情况下,一个类中的成员属性的名字对外是不可见的,这时候我们只可以得出他的成员类型的数组field[],在不知道确切变量名的情况下不可以定位到确切的变量上。而他提供了对这个属性公开的读(get)、写(set)方法, 虽然方法名和方法操作的对象有时候有很大的关系,但是我们不能保证这个关系一定成立。而且这种只提供get、set方法,不提供变量名的情况还很常见,因此java就将这种抽象为javabean类,对javabean类的操作,通过get、set函数后面的名字就“拟”得出变量的名字。通过这个名字,我们可以确切的求出某个变量的值。而对javabean的操作是通过内省(introspector)来完成的。
      建议:不明白可以去看看张孝祥老师的相关视频。





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