25、内省

来源:互联网 发布:软件需求变更单 编辑:程序博客网 时间:2024/05/20 14:26

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


JavaBean
      是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。如果方法名为setId,中文意思即为设置id。    字段对外提供了get或set方法就可以称之为属性,一个get方法就为一个属性,一个类中还有一个从object中获得的getclass方法既一个calss属性
总之,一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。

JavaBean的分类
a)狭义的JavaBean
           .私有的字段(Field)
           .对私有字段提供存取方法(读写方法)
b)广义的JavaBean
           .私有的字段(Field)
           .对私有字段提供存取方法(读写方法)
           .数量任意的业务方法 



1、内省 introspector 对javabean进行操作
  javabean 方法的名字以set 或get打头
  Javabean的属性是根据方法名来判断属性的,
  getAge---->对应的属性名 age
应用
主要在两个模块之间传递信息
  属性描述 propertydescriptor
  内省获得值
  propertyDescriptor pd = new propertyDescriptor(propertName, pt1.getClass)
  get方法
  Method methodGet= pd.getReadMethod();
   object retval = methodGet.invoke(pt1);
  set方法
 Method methodSet= pd.getWriteMethod();
  methodSet .invoke(pt1,7)
 
2、配置文件的加载:
  配置文件的加载一般都是使用类加载器
  方法
   类名.classs.getClassLoader().getResouseStresm("相对于类的路径")
   类名.classs.getResouseStresm("/相对于classpath的路径")
   类名.classs.getResouseStresm("相对于类的路径")
3、针对javabean的工具包 BeanUtils
BeanUtils.getproperty(pt1,"x")
BeanUtils.setProperty(pt1,"x","9")
  支持属性级联
  把一个对象身上的属性拷贝到另一个属性身上
  propertyUtils.setproperty(pt1,"x",9)
4、得到javabean的所有属性(早期代码)
  BeanInfo beanInfo= Introspector.getBeanInfo(pt1.getClass())
  properstyDescripror[] pds= beanInfo.getPropertyDescriptors();
  object value=null;
  for(propertyeDescriptor pd:pds){
     if(pd.getName.equals(properName)){
     Method methodGetx= pd.getReadMethod();
     retVal=methodGetx.invoke(pt1)
     break;
     }
  }

Instropector 内省->站在反射的角度,主要用于对JavaBean进行操作
操作javaBean就是对javaBean进行get和set操作。两种方法如下:
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class BeanTest {
 public static void main(String[] args) throws Exception{
  ReflectPiont piont = new ReflectPiont("hehe","haha");
  String propertyName = "name";
  //把ReflectPiont 当做JavaBean看,并且得到其所有JavaBean信息
  BeanInfo beanInfo = Introspector.getBeanInfo(piont.getClass());
 
  //PropertyDescriptor是JavaBean的属性描述符,用于描述JavaBean的属性
  PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//得到JavaBean的所有属性
 
  for(PropertyDescriptor pd:pds)
  {
   //System.out.println(pd.getName());
   if(pd.getName().equals(propertyName))
   {
    //得到该属性的get方法
    Method getName = pd.getReadMethod();
    //调用该方法并指定在哪个对象上调用
    System.out.println(getName.invoke(piont));
   }
  }
 
  //新建一个PropertyDescriptor,并指定把哪个类看做JavaBean和属性的名字
  PropertyDescriptor pd = new PropertyDescriptor(propertyName, piont.getClass());
  Method getName = pd.getReadMethod();
  System.out.println(getName.invoke(piont));
 }
}
BeanUtils框架/工具(APACHE开源组织开发)
 1)BeanUtils框架能够完成内省的一切功能,而且优化
 2)BeanUtils框架能够对String<->基本类型自动转化
 3)BeanUtils框架自定义转换器:
ConvertUtils.register( 转换规则,目标对象的Class)
 4)向BeanUtils框架注册自定义转换器必须放在bu.setProperty()代码之前
 5)使用BeanUtils内置String->Date的转换器:
ConvertUtils.register(newDateLocaleConverter(),java.util.Date.class);
应用代码如下:
/*使用BeanUtils包中的方法设置JavaBean属性
  第一个参数:被看做javaBean的对象 第二个参数:属性的名称
  第三个参数:想要设置的值,基本类型都可以以String形式传入,BeanUtils会将String自动转换
  为八种基本类型
  */
  BeanUtils.setProperty(piont, propertyName, "zyg");
 
  //根据属性名得到属性值
  System.out.println(BeanUtils.getProperty(piont, propertyName));
  /*
   * 事实上,BeanUtils的set和get方法都是以字符串的形式对属性进行操作的
   * 因为其内部数据类型进行了自动的转换,以适用javaWeb的应用
   */
  /*BeanUtils.describe(bean);此方法将JavaBean转换成一个Map集合
  即<属性,值>这样的键值对*/
 
  //向BeanUtils注册自定义的转换器(String->java.util.Date.class)
  ConvertUtils.register(new Converter(){
  @Override
  public Object convert(Class type, Object value) {
   /*第一个参数:所要转换的目标类型 java.util.Date.class
    * 第二个参数:传入的参数类型 java.lang.String
    */
   
   String strBirthday = (String)value;
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   try {
    return sdf.parse(strBirthday);
   } catch (ParseException e) {
    e.printStackTrace();
    return null;
   }
   
   }
  }, java.util.Date.class);
  BeanUtils.setProperty(piont, "birthday", "2010-3-11");
  System.out.println(BeanUtils.getProperty(piont, "birthday"));


0 0
原创粉丝点击