java.beans包概述


title: java.beans包概述
date: 2019-02-09 21:17:05
tags: Java
categories: Java

java.beans包包含了开发bean相关的类,各种操作自定义bean的类,比如持久化类实例,内省实现。

持久化

举一个使用java.beans包中类的例子

目的: 将User类的实例,存储到xml文件中,然后从xml文件中读取该实例输出

用到的类java.beans.XMLDecoder,java.beans.XMLEncoder

User.java

package yoke.jvm.lab;

import java.io.Serializable;

/**
 * @Author Yoke
 * @Date 2019/02/09 下午9:04
 */
public class User implements Serializable {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

Test.java

package yoke.jvm.lab;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;

/**
 * @Author Yoke
 * @Date 2019/02/09 下午7:52
 */
public class Test {
    public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("a.xml")) {
            User user = new User();
            user.setName("yoke");
            user.setAge(10);
            XMLEncoder encoder = new XMLEncoder(outputStream);
            encoder.writeObject(user);
            encoder.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try (InputStream inputStream = new FileInputStream("a.xml")) {
            XMLDecoder decoder = new XMLDecoder(inputStream);
            User user = (User) decoder.readObject();
            System.out.println(user.getName() + ":" + user.getAge());
            decoder.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

最终输出的a.xml中的内容是:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_191" class="java.beans.XMLDecoder">
 <object class="yoke.jvm.lab.User">
  <void property="age">
   <int>10</int>
  </void>
  <void property="name">
   <string>yoke</string>
  </void>
 </object>
</java>

控制台输出内容:

yoke:10

内省-反射的方式操作get,set方法

内省(Introspector)是Java语言对Bean类属性、事件的一种缺省处理方法。

我是没看懂上边这一句话。Java中提供的一套API,专门用于访问某个属性的get,set方法,这就是内省

通常的操作: 通过Introspector获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器PropertyDescriptor,
通过这个属性描述器就可以获取某个属性对应的getter/setter方法,最后运用反射技术执行方法

可以通过下边这个例子更好的理解内省

package yoke.jvm.lab;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Author Yoke
 * @Date 2019/02/09 下午7:52
 */
public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.setName("yoke");
        user.setAge(1);
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(User.class);

            PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor descriptor : descriptors) {
                if (descriptor.getName().equals("name")) {
                    Method writeMethod = descriptor.getWriteMethod();
                    writeMethod.invoke(user, "Yoke");
                    Method readMethod = descriptor.getReadMethod();
                    Object o = readMethod.invoke(user);
                    System.out.println("修改之后的名字是: " + o);
                }
            }
        } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}


结果

修改之后的名字是: Yoke
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值