zoukankan      html  css  js  c++  java
  • 内省(introspector)------>JavaBean

    内省(introspector)------>JavaBean
        1、问什么要学内省?
            开发框架时,经常需要Java对象的属性来来封装程序的数据,每次使用反射技术完成此操作过于麻烦,所以SUN
            公司开发了一套API,专门操作Java对象的属性
        2、什么是JavaBean和属性的读写方法?
        3、通过内省技术访问(Java.beans包提供了内省的API)JavaBean的两张方式
            贱人 小婊砸 矫情 &、通过introspector类获取Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor)
               通过这个属性器,就可以获取某个属性对应getter和setter方法,然后通过反射机制来调用这些方法
            &、通过PropertyDescriptor类操作Bean的属性
    -------------------------------------------------
    private String name="mumu";//字段
        private int age;//字段
        private Date birthdy;
        public String getName(){//属性指的是设置获取setter和读写getter的字段的方法
            return name;
        }
        public Date getBirthdy() {
            return birthdy;
        }
        public void setBirthdy(Date birthdy) {
            this.birthdy = birthdy;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getAbc(){//属性:属性的名称是abc
            return "abc";
        }
    -------------------------------------------------

        一、内省:操作属性的(类中的getter和setter方法)
            得到student类属,封装到BeanInfo中
            BeanInfo  bean = Introspector.getBeanInfo(Student.class);
            得到类中的所有属性描述器
            PropertyDescriptor[]  pd = bean.getPropertyDescriptors();
            system.out.println(pd.length);//打印出来Student类中属性的长度

            for(PropertyDescriptor p:pd){//属性:属性的名称是abc
                system.out.println(p.getName());//打印出属性name的值
            }
        二、// PropertyDescriptor(String propertyName, Class<?> beanClass)
            // 通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。

            //创建student对象
            Student s = new Student();
            //得到类中的属性描述器
            PropertyDescriptor  p = new PropertyDescriptor("name",Student.class);//name为属性的名称,Student.class为student的字节码

            Method m = p.getReadMethod();//得到getName()的方法
            //得到的是string类型的值
            String str = (String)m.invoke(s,null);//s:为那个对象的;null:表示传入的值,次返回的是Object的值,请转换成String类型的值
            sysotem.out.println(str);
            //设置属性的值
            Method me = p.getWriteMethod();//得到setName()的值
            me.invoke(s,"xiaomumu");
            system.out.println(s.getName());
        三、//利用BeanUtils框架来操作属性

            //创建student对象
            Student  s= new Student();
            //调用getName()方法
            String str = BeanUtils.getProperty(s,"name");//s:表示为那个对象的,"name":表示为对象中名称为“name”属性的方法
            sysotem.out.pritnln(str);
            //设置name属性的值
             BeansUtils.setProperty(s,"name",value);s:表示为那个对象的,"name":表示为对象中名称为“name”属性的方法,value:表示所输入的值
             system.out.println(s.getName());//打印修改后:属性名称为name的值
        四、//BeanUtils可以进行类型的自动装换,但仅限于基本类型之间,如:需要int类型的,输入String类型的也可以
            //创建student对象
            Student s = new Student();

            String str = BeanUtils.getProperty(s,"age");//得到getAge()方法
            system.out.println(str);
            //设置age属性的值

            BeanUtils.setProperty(s,"age","12");//设置age字段的值为字符串,beanUtils可以进行自动的转换
            system.out.println(s.getAge());


        五、//对于非基本类型的设置
            //用户输入的都是字符类型
            //String <---------->和其他类型之间的互相装换
            //用户看到的都是string类型的

            Student  s = new Student();

            //给BeanUtils注册类型装换器

            //new DateLocaleConverter():转化成本地类型

            ConvertUtils.register(new converter(){//匿名内部类实现内部类   register:注册类型转换器,给什么类型,转换成想要得到的类型
                //type:目标类型,也就是想要转换成的类型
                //value:当前传入的值
            public Object convert(Class type, Objcet value){}
                // if(value.equals(Date.class)){
                // //字符串转换成Date类型
                // }else{
                // //Date转换成字符串类型
                // }

            DateFormat df = new simpleDateFormat("yyyy-MM-dd");
            //传入String的值
            if(value instanceof String){//instanceof:实类化对象
            //字符串数据类型转换成Date数据类型
            String str = (String)value;
            try{
                Date dt = df.prase();//把字符串类型的数据解析成Date类型
                return dt;
            }cache(Exception e){
                throw new RuntimeException(e);
            }
            
            
            }else{
            //Date数据类型转换成String类型
            Date d = (Date)value;
            String  str=df.format(d);
            return s;
            
            }
            BeanUtils.setProperty(s,"birthdy","3002-03-03");
            system.out.println(s.getBirthdy());


            },Date.class);
        六、//利用BeanUtils封装数据
            Map  map = new HashMap();

            map.put("name","xiaomumu");
            map.put("age",18);
            map.put("birthdy","2001-01-01");

            Person p = new Person();
            //封装数据前
            System.out.println("封装数据前:"+p);
            CovertUtils.register(new DateLocaleConverter(),Date.class);
            BeanUtils.populate(p,map);
            System.out.println("封装数据后:"+p);

  • 相关阅读:
    内向者生存手册
    不良言论屏蔽方案探讨——附加一点思考
    提高复用性的编码习惯
    如何管好.net的内存
    谨防信息超载
    .net的反对派们,精神比表面的东西更重要
    为什么我老是半途而废?
    对不起,我也是来给.Net泼冷水的(山寨版)
    把重要的事情先做好
    学英语(外语)的一个误区
  • 原文地址:https://www.cnblogs.com/XMMDMW/p/5352286.html
Copyright © 2011-2022 走看看