JavaBean的基本的操作

反射封装类的数据

public class PersonFactory {

    public static Object newInstance(){
        Object object=null;
        try {
            //只能是在这个方法内进行读取这个文件,然后再进行封装数据了
            //创建一个输入流
            BufferedReader br=new BufferedReader(new FileReader("obj.txt"));
            //进行读取第一行数据
            String classpath=br.readLine();
            Class clazz=Class.forName(classpath);
            Constructor constructor=clazz.getConstructor();
            object=constructor.newInstance();//空参数的数据
            //进行读取字段中数据
            String line=null;
            while((line=br.readLine())!=null){
                String data[]=line.split("=");
                //进行封装数据,得到字段
                Field field=clazz.getDeclaredField(data[0]);
                field.setAccessible(true);//设置一下可访问的权限
                //进行判断一下我们的字段的类型
                if(field.getType()==Integer.class){
                    field.set(object,Integer.parseInt(data[1]));
                }else if(field.getType()==String.class){
                    field.set(object,data[1]);
                }//其他的类型这里就不用说了,也是这样子的判断就可以了

            }

            } catch (Exception e) {
            e.printStackTrace();
        }
        return object;
    }

    public static void main(String[] args) {
        Person p=(Person) PersonFactory.newInstance();
        System.out.println(p);
    }

}

内省封装类的数据,要用到我们有JavaBean当中的set/get方法,这种方式有点麻烦,但是我们的apache组织用内省的技术给我们封装了一个api,这个Api就会很方便我们的来操作这个JavaBean了

public class IntrospectorTest {

    //得到这个类的所有的成员
    @Test
    public void getAllField() throws Exception{
        BeanInfo info=Introspector.getBeanInfo(Emp.class);
        //得到类中所有的成员
        PropertyDescriptor[] descs=info.getPropertyDescriptors();
        //进行遍历成员
        for(PropertyDescriptor p:descs){
            System.out.println(p.getPropertyType());
        }
    }

    public static void main(String[] args) throws Exception {
        //使用内省的操作
        //创建对象
        Emp p=new Emp();
        //设置对象的成员的值,用到的是粗性描述器对象
        PropertyDescriptor desc=new PropertyDescriptor("name",Emp.class);//表示的是用到那个的类的那个成员
        //给这个成员设置值
        Method m1=desc.getWriteMethod();//得到set方法
        //进行方法的调用
        m1.invoke(p,"yanghailong");
        //得到我们成员的值
        Method m=desc.getReadMethod();//得到的是我们的Get方法
        m.invoke(p,null);//get方法没有参数
        System.out.println(p);
    }

}

Apache组织的利用内省封装的BeanUtils技术操作JavaBean的基本的操作如下:

/**
    这个操作不用考虑到我们的数据的类型
    使用步聚如下:
    1.1导包:commons-logging.jar,commons-beanutils-1.8.0.jar
    1.2最关键的二个Api如下:BeanUtils.setProperty和ConvertUtils.register(主要是用来注册转换的数据类型的)
    因为这个BeanUtils当中只有是基本的数据类型时都会自动帮我们进行转换,如果是引用的数据类型我们只有进行手动的注册数据的
    转换类型,当然也可以手动转换好类型后再进行设置值

 */
public class MyBeanUtilsDemo {
    @Test
    public void beanTest() throws Exception{
        //创建对象
        Emp emp=new Emp();
        //封装成员
        BeanUtils.setProperty(emp,"name","yanghailong");
        BeanUtils.setProperty(emp,"id","23");//如果是基本的数据类型,那么这个数据会自动帮助我们的转换

        ConvertUtils.register(new Converter() {

            @Override
            public Object convert(Class type, Object value) {

                Date data;
                try {
                    //创建一个SimpleDateFormat
                    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
                    data = format.parse((String)value);
                    return data;
                } catch (ParseException e) {
                    e.printStackTrace();
                } 
                return null;
            }
        }, Date.class);
        //如果是复杂的数据类型,那么要进行注册一个数据转换器,同时也可以自己转换好数据的类型然后再进行设置数据
        BeanUtils.setProperty(emp,"birthday","2017-12-8");

        System.out.println(emp);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值