分享

Java Bean

 ha_rdly 2016-08-20

       JAVABEAN是一个遵循特定写法的java类,它通常具有如下特点:

        1.这个java类必须具有一个无参构造函数

        2.属性必须私有化

        3.私有化的属性必须通过public类型的方法暴露给其他程序,并且方法的命名也必须遵守一定的命名规范

JAVABEAN属性:

   

一、定义:

     把一个拥有对属性进行set和get方法的类,我们就可以称之为JavaBean。实际上JavaBean就是一个java类,在这个java类中就默认形成了一种规则——对属性进行设置和获得。而反之将说ava类就是一个JavaBean,这种说法是错误的,因为一个java类中不一定有对属性的设置和获得的方法(也就是不一定有set和get方法)。

二、从JavaBean中就引出了一个内省的概念

     内省:把一类中需要进行设置和获得的属性访问权限设置为private(私有的)让外部的使用者看不见摸不着,而通过public(共有的)set和get方法来对其属性的值来进行设置和获得,而内部的操作具体是怎样的?外界使用的人不用不知道,这就称为内省。

三,这里有一个面试题,分享一下

        存在一个JavaBean,它包含以下几种可能的属性:

           1:boolean/Boolean

         2:int/Integer

         3:String

         4:double/Double

         属性名未知,现在要给这些属性设置默认值,以下是要求的默认值:

          String类型的默认值为字符串 www.itheima.com

         int/Integer类型的默认值为100

         boolean/Boolean类型的默认值为true

         double/Double的默认值为0.01D.

只需要设置带有getXxx/isXxx/setXxx方法的属性,非JavaBean属性不设置,请用代码实现

/*

设计思路:

        设计一个模拟题目要求的JavaBean类,通过反射进行对其中的未知属性名的变量赋值。

        1,拿到字节码文件,建立一个空构造函数的实例对象。

        2,利用字节码作为参数,Introspector.getBeanInfo(JavaBean.class)得到BeanInfo实例对象。

        3,通过BeanInfo的方法,beanInfo.getPropertyDescriptors()拿到该字节码的所有属性描述。

        3,通过PropertyDescriptor--属性描述实例对象,通过调用getWriteMethod()方法,修改字节码中属性的值。

        4,在通过属性描述中getPropertyType()方法,定位是那种类型的成员变量,筛选出后,进行相应的修改赋值。

        */

这里是源码分享一下

    package com.itheima;

import java.beans.BeanInfo;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Method;

/*       

* 5、 存在一个JavaBean,它包含以下几种可能的属性:

1:boolean/Boolean

2:int/Integer

3:String

4:double/Double

属性名未知,现在要给这些属性设置默认值,以下是要求的默认值:

String类型的默认值为字符串 www.itheima.com

int/Integer类型的默认值为100

boolean/Boolean类型的默认值为true

double/Double的默认值为0.01D.

只需要设置带有getXxx/isXxx/setXxx方法的属性,非JavaBean属性不设置,请用代码实现

*/

/*

* 设计思路:

        设计一个模拟题目要求的JavaBean类,通过反射进行对其中的未知属性名的变量赋值。

        1,拿到字节码文件,建立一个空构造函数的实例对象。

        2,利用字节码作为参数,Introspector.getBeanInfo(JavaBean.class)得到BeanInfo实例对象。

        3,通过BeanInfo的方法,beanInfo.getPropertyDescriptors()拿到该字节码的所有属性描述。

        3,通过PropertyDescriptor--属性描述实例对象,通过调用getWriteMethod()方法,修改字节码中属性的值。

        4,在通过属性描述中getPropertyType()方法,定位是那种类型的成员变量,筛选出后,进行相应的修改赋值。

        */

       

//建立模拟JavaBean类

class JavaBean{

        //成员变量

        private boolean flag;

        private int number;

        private String itcast;

        private double money;

       

        //成员变量相应的set和get方法

        public void setItcast(String newitcast){

                itcast=newitcast;

        }

        public String getItcast(){

                return itcast;

        }

       

        public void setNumber(int newnumber){

                number=newnumber;

        }

        public int getNumber(){

                return number;

        }

       

        public void setFlag(boolean newflag){

                flag=newflag;

        }

        public boolean getFlag(){

                return flag;

        }

       

        public void setMoney(double newmoney){

                money=newmoney;

        }

        public double getMoney(){

                return money;

        }

}

public class HeiMa{

        public static void main(String[] args) throws Exception {

                     //拿到字节码

                        Class<JavaBean> clazz=JavaBean.class;

                     //拿到字节码的一个对象实例

                        Object obj=clazz.newInstance();

                     //通过字节码拿到BeanInfo实例对象

                        BeanInfo beanInfo=Introspector.getBeanInfo(clazz);

                     //通过BeanInfo拿到这个字节码的所有属性描述

                        PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();

                    //通过属性描述对象拿到属性对应的set方法和get方法,通过set方法进行属性赋值

                        for(PropertyDescriptor pd:pds){

                     //拿到当前属性的set方法

                         Method setMethod=pd.getWriteMethod();

                     Method getMethod=pd.getReadMethod();

                               

                     //拿到当前属性的类型字节码

                        Class<?> properclass=pd.getPropertyType();

                    //通过字节码来筛选出相应的属性,再对应赋值,赋值完毕后,通过打印get方法查看赋值情况。

                        if(properclass==String.class){

                     setMethod.invoke(obj, "www.itheima.com");

                     System.out.println(getMethod.invoke(obj));

                     }else if(properclass==int.class || properclass==Integer.class){

                   setMethod.invoke(obj, 100);

                   System.out.println(getMethod.invoke(obj));

                    }else if(properclass==Boolean.class || properclass==boolean.class){

                   setMethod.invoke(obj, true);

                  System.out.println(getMethod.invoke(obj));

                  }else if(properclass==Double.class || properclass==double.class){

                  setMethod.invoke(obj, 0.01D);

                  System.out.println(getMethod.invoke(obj));

                                }

                               

                        }                         

              }          

        }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多