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
来获取属性的描述器PropertyDescripto
r,
通过这个属性描述器就可以获取某个属性对应的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