一道javaBean内省题

来源:互联网 发布:统计联网直报平台数据 编辑:程序博客网 时间:2024/06/05 15:09
/** * 存在一个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属性不设置,请用代码实现 *  * *思路:内省 *1、操作的是JavaBean属性,不访问非JavaBean属性,那么就要拿到所有JavaBean属性的描述器:先Introspector.getBeanInfo,通过该类的字节码拿到BeanInfo *然后用BeanInfo拿到所有JavaBean属性的描述器 *2、对所有JavaBean属性的描述器进行迭代,在迭代中,拿到属性的设置方法,对当前属性进行判断,对对应的属性进行设置。 * * */
public static void main(String[] args) throws Exception    {         MyBean mb = new MyBean();        Class<MyBean> beanClass = MyBean.class;//根据名字拿到Class对象        BeanInfo bif = Introspector.getBeanInfo(beanClass,Object.class);//获得javaBean类的bean信息        PropertyDescriptor[] pds = bif.getPropertyDescriptors();//获得javaBean类中所有JavaBean属性的描述器        for(PropertyDescriptor pd : pds)//对所有JavaBean属性进行迭代        {            Method setX = pd.getWriteMethod();//拿到当前迭代的属性的set方法            Class xType = pd.getPropertyType();//拿到当前迭代的属性的类型            if(xType==String.class)//如果该属性是字符串类型            {                setX.invoke(mb, "www.itheima.com");            }            else if (xType==int.class || xType==Integer.class)//如果是int或Integer类型            {                setX.invoke(mb, 100);            }            else if (xType==double.class || xType==Double.class)//如果是double/Double类型            {                setX.invoke(mb, 0.01D);            }            else if (xType==boolean.class || xType==Boolean.class)//如果是boolean/Boolean类型            {                setX.invoke(mb, true);            }        }    /*  //查看设置的结果        System.out.println(mb.getWebSite());        System.out.println(mb.getNum());        System.out.println(mb.getPay());        System.out.println(mb.isFlag());*/    }

扩展:(待续)
1、如果连类名都不知道,要等待外方输入,怎么写这个方法?
2、不采用内省的方式,用暴力反射怎么做?

0 0
原创粉丝点击