在Java中,PropertyChangeListener
是一个接口,用于监听和响应 JavaBeans 属性值的变化。当一个 JavaBean 的属性值发生变化时,它会通知所有注册的 PropertyChangeListener
。
以下是 PropertyChangeListener
接口的一个基本示例:
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
/**
* 该类演示了如何使用JavaBeans的属性变化监听机制。
*/
public class MyServletContextAttributeListener {
public static void main(String[] args) {
// 创建属性变化监听器实例
MyPropertyChangeListener listener = new MyPropertyChangeListener();
// 创建一个PersonInfo列表,用于存储多个PersonInfo对象
ArrayList<PersonInfo> personInfoList = new ArrayList<>();
// 循环创建PersonInfo对象,并将监听器添加到每个对象
for (int i = 0; i < 10000; i++) {
PersonInfo personInfo = new PersonInfo();
personInfo.addPropertyChangeListener(listener);
personInfoList.add(personInfo);
}
// 循环设置PersonInfo对象的属性值,并触发属性变化事件
for (int i = 0, len = personInfoList.size(); i < len; i++) {
personInfoList.get(i).setAge(i);
personInfoList.get(i).setFavorite("新值" + i);
personInfoList.get(i).setName("张三" + i);
}
}
}
/**
* 属性变化的监听器,实现了PropertyChangeListener接口。
* 当监听的属性发生变化时,会调用propertyChange方法。
*/
class MyPropertyChangeListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
// 打印属性变化的详细信息
System.out.println("属性 " + evt.getPropertyName() + " 发生变化,旧值为 " + evt.getOldValue() + ",新值为 " + evt.getNewValue() + "; age:" );
}
}
/**
* PersonInfo类,用于存储个人信息。
* 使用PropertyChangeSupport来管理属性变化事件。
*/
class PersonInfo {
private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private String favorite;
private Integer Age;
private String name;
/**
* 设置favorite属性,并触发属性变化事件。
*
* @param newFavorite 新的favorite值
*/
public void setFavorite(String newFavorite) {
String oldFavorite = this.favorite;
this.favorite = newFavorite;
pcs.firePropertyChange("favorite", oldFavorite, newFavorite); // 触发属性变化事件
}
public String getFavorite() {
return favorite;
}
/**
* 设置name属性,并触发属性变化事件。
*
* @param value 新的name值
*/
public void setName(String value) {
String oldName = this.name;
this.name = value;
pcs.firePropertyChange("name", oldName, this.name); // 触发属性变化事件
}
public String getName() {
return name;
}
/**
* 设置age属性。注意,这里没有触发属性变化事件。
*
* @param age 新的age值
*/
public void setAge(Integer age) {
Age = age;
}
public Integer getAge() {
return Age;
}
/**
* 添加属性变化监听器。
*
* @param listener 要添加的监听器
*/
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
/**
* 移除属性变化监听器。
*
* @param listener 要移除的监听器
*/
public void removePropertyChangeListener(PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
}