JavaBeans核心技术详解:从基础使用到高级特性完整教程
本文全面解析Java标准库中的java.beans包,详细介绍了JavaBeans规范的四大核心功能:内省机制用于分析Bean结构、属性变更支持实现监听器模式、持久化机制完成序列化操作、自定义编辑器提供图形化支持。通过5个完整的实战代码示例,包括基本JavaBean定义、内省分析、属性变更监听、XML序列化以及自定义BeanInfo,帮助开发者深入理解并掌握JavaBeans在企业级应用中的实际运用。
java.beans 包是 Java 标准库的一部分,主要用于处理 JavaBean 组件。JavaBean 是一种符合特定规范的 Java 类,通常用于 GUI 开发、序列化和各种框架中。
主要功能
1、内省 (Introspection) - 分析 Bean 的属性和方法
2、属性变更支持 - 监听属性变化
3、持久化 - 序列化和反序列化 Bean
4、自定义编辑器 - 为属性提供图形化编辑器
核心类
1、Introspector - 分析 Bean 的结构
2、PropertyDescriptor - 描述 Bean 属性
3、BeanInfo - 提供 Bean 的元信息
4、PropertyChangeSupport - 管理属性变更监听器
5、XMLEncoder/XMLDecoder - XML 序列化
示例代码
1. 基本 JavaBean
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
public class PersonBean implements Serializable {
private String name;
private int age;
// 属性变更支持
private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
// 无参构造器
public PersonBean() {}
public PersonBean(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 和 Setter 方法
public String getName() {
return name;
}
public void setName(String name) {
String oldValue = this.name;
this.name = name;
// 触发属性变更事件
propertyChangeSupport.firePropertyChange("name", oldValue, name);
}
public int getAge() {
return age;
}
public void setAge(int age) {
int oldValue = this.age;
this.age = age;
propertyChangeSupport.firePropertyChange("age", oldValue, age);
}
// 属性变更监听器管理
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
@Override
public String toString() {
return "PersonBean{name='" + name + "', age=" + age + "}";
}
}
2. 使用内省分析 Bean
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class BeanIntrospectionExample {
public static void main(String[] args) throws Exception {
// 获取 Bean 信息
BeanInfo beanInfo = Introspector.getBeanInfo(PersonBean.class);
// 分析属性
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
System.out.println("PersonBean 的属性:");
for (PropertyDescriptor pd : propertyDescriptors) {
if (!"class".equals(pd.getName())) { // 跳过 Class 属性
System.out.println("属性名: " + pd.getName());
System.out.println("属性类型: " + pd.getPropertyType());
Method readMethod = pd.getReadMethod();
Method writeMethod = pd.getWriteMethod();
if (readMethod != null) {
System.out.println("Getter: " + readMethod.getName());
}
if (writeMethod != null) {
System.out.println("Setter: " + writeMethod.getName());
}
System.out.println("---");
}
}
// 使用内省设置属性值
PersonBean person = new PersonBean();
for (PropertyDescriptor pd : propertyDescriptors) {
if ("name".equals(pd.getName())) {
Method setter = pd.getWriteMethod();
if (setter != null) {
setter.invoke(person, "张三");
}
}
if ("age".equals(pd.getName())) {
Method setter = pd.getWriteMethod();
if (setter != null) {
setter.invoke(person, 25);
}
}
}
System.out.println("设置后的 Person: " + person);
}
}
3. 属性变更监听器
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class PropertyChangeExample {
public static void main(String[] args) {
PersonBean person = new PersonBean("李四", 30);
// 添加属性变更监听器
person.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("属性变更事件:");
System.out.println(" 属性名: " + evt.getPropertyName());
System.out.println(" 旧值: " + evt.getOldValue());
System.out.println(" 新值: " + evt.getNewValue());
System.out.println(" 源对象: " + evt.getSource());
System.out.println("---");
}
});
// 修改属性,将触发监听器
System.out.println("修改姓名:");
person.setName("王五");
System.out.println("修改年龄:");
person.setAge(35);
}
}
4. XML 序列化示例
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.*;
public class XMLSerializationExample {
public static void main(String[] args) throws Exception {
PersonBean person = new PersonBean("赵六", 28);
// 序列化到 XML
try (XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
new FileOutputStream("person.xml")))) {
encoder.writeObject(person);
}
System.out.println("对象已序列化到 person.xml");
// 从 XML 反序列化
try (XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(
new FileInputStream("person.xml")))) {
PersonBean restoredPerson = (PersonBean) decoder.readObject();
System.out.println("从 XML 恢复的对象: " + restoredPerson);
}
}
}
}}}
生成的 XML 文件内容示例:
{{{<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0" class="java.beans.XMLDecoder">
<object class="PersonBean">
<void property="age">
<int>28</int>
</void>
<void property="name">
<string>赵六</string>
</void>
</object>
</java>
5. 自定义 BeanInfo
import java.beans.*;
public class CustomPersonBeanInfo extends SimpleBeanInfo {
@Override
public PropertyDescriptor[] getPropertyDescriptors() {
try {
PropertyDescriptor nameDescriptor = new PropertyDescriptor("name", PersonBean.class);
PropertyDescriptor ageDescriptor = new PropertyDescriptor("age", PersonBean.class);
// 为属性添加描述
nameDescriptor.setShortDescription("人员的姓名");
ageDescriptor.setShortDescription("人员的年龄");
return new PropertyDescriptor[] { nameDescriptor, ageDescriptor };
} catch (IntrospectionException e) {
e.printStackTrace();
return null;
}
}
}
运行结果示例
运行 PropertyChangeExample 的输出:
修改姓名:
属性变更事件:
属性名: name
旧值: 李四
新值: 王五
源对象: PersonBean{name='王五', age=30}
---
修改年龄:
属性变更事件:
属性名: age
旧值: 30
新值: 35
源对象: PersonBean{name='王五', age=35}
---
这些示例展示了 java.beans 包的主要功能,包括 Bean 的定义、内省分析、属性变更监听和 XML 序列化等核心特性。
最后更新于6月前
本文由人工编写,AI优化,转载请注明原文地址: java.beans使用方法及代码示例
推荐阅读
评论 (3)
请 登录 后发表评论
这篇指南太实用了!示例代码很清晰,特别是属性变更监听的部分,让我对JavaBeans的实际应用有了更深理解。感谢作者的详细分享!
很详细的JavaBeans指南!示例代码特别实用,让我对属性变更监听和XML序列化的理解更深了。感谢作者的用心整理!
感谢作者分享这么详细的JavaBeans指南!示例代码很实用,帮我解决了项目中属性监听的问题。