Java重要技术(15)内省之属性改变事件和投票否决事件

1.1. 属性改变事件和投票否决事件

PropertyChangeSupport类为Java Bean支持属性改变事件提供了方便。

/**   

* @Title: EventBean.java

* @Package com.test.javatechnology.introspection

* @Description:

* @author http://www.cnblogs.com/coe2coe/

* @date 2017年3月25日 下午6:02:36

* @version V1.0   

*/

package com.test.javatechnology.introspection;

import java.beans.PropertyChangeListener;

import java.beans.PropertyChangeSupport;

/**

* @ClassName: EventBean

* @Description:

* @author http://www.cnblogs.com/coe2coe/

* @date 2017年3月25日 下午6:02:36

*  

*/

public class EventBean {

public EventBean(){

}

//定义属性更改事件支持。

private PropertyChangeSupport   changes = new PropertyChangeSupport(this);

/**

 * 添加属性更改事件监听器。

 * @param propertyName  待监听的属性名称

 * @param listener 事件监听器。

 */

public void addListener(String propertyName,PropertyChangeListener  listener){

changes.addPropertyChangeListener(propertyName, listener);

}

/**

 * 移除属性更改事件监听器。

 * @param propertyName  待监听的属性名称

 * @param listener 事件监听器。

 */

public void removeListener(String propertyName,PropertyChangeListener  listener){

changes.removePropertyChangeListener(propertyName, listener);

}

//唯一的属性。

private int value;

public int getValue() {

return value;

}

//在更改属性时出发事件。

public void setValue(int value) {

try{

int oldValue = this.value;

//触发属性更改事件。

changes.firePropertyChange("value", oldValue, value);

this.value = value;

}catch(Exception e){//当在事件监听器中发生异常时忽略本次属性赋值操作。

e.printStackTrace();

}

}

}

//添加事件监听器的代码如下:

//创建Java Bean的实例。

EventBean  obj = new EventBean();

//添加属性改变事件监听器。

obj.addListener("value", new PropertyChangeListener(){

@Override

public void propertyChange(PropertyChangeEvent evt) {

//输出属性的名称,旧值,新值。

System.out.println("propertyChange:"

 + "property:" + evt.getPropertyName()

 + " oldValue:"  + evt.getOldValue()

 + " newValue:"  + evt.getNewValue());

}

});

//设置新值。

obj.setValue(1);

obj.setValue(100);

运行结果如下:

propertyChange:property:value oldValue:0 newValue:1

propertyChange:property:value oldValue:1 newValue:100

使用否决投票监听器可以阻止属性的更改操作。VetoableChangeSupport类为投票监听器提供了方便。

支持否决投票监听器的Java Bean如下所示:

/**   

* @Title: EventBean.java

* @Package com.test.javatechnology.introspection

* @Description:

* @author http://www.cnblogs.com/coe2coe/

* @date 2017年3月25日 下午6:02:36

* @version V1.0   

*/

package com.test.javatechnology.introspection;

import java.beans.PropertyChangeListener;

import java.beans.PropertyChangeSupport;

import java.beans.VetoableChangeListener;

import java.beans.VetoableChangeSupport;

/**

* @ClassName: EventBean

* @Description:

* @author http://www.cnblogs.com/coe2coe/

* @date 2017年3月25日 下午6:02:36

*  

*/

public class VetoableEventBean {

public VetoableEventBean(){

}

//定义否决更改事件支持

private VetoableChangeSupport vetoableChanges = new VetoableChangeSupport(this);

public void addListener(String propertyName,VetoableChangeListener   listener){

vetoableChanges.addVetoableChangeListener(propertyName,listener);

}

public void removeListener(String propertyName,VetoableChangeListener   listener){

vetoableChanges.removeVetoableChangeListener(propertyName,listener);

}

//定义属性更改事件支持。

private PropertyChangeSupport   changes = new PropertyChangeSupport(this);

/**

 * 添加属性更改事件监听器。

 * @param propertyName  待监听的属性名称

 * @param listener 事件监听器。

 */

public void addListener(String propertyName,PropertyChangeListener  listener){

changes.addPropertyChangeListener(propertyName, listener);

}

/**

 * 移除属性更改事件监听器。

 * @param propertyName  待监听的属性名称

 * @param listener 事件监听器。

 */

public void removeListener(String propertyName,PropertyChangeListener  listener){

changes.removePropertyChangeListener(propertyName, listener);

}

//唯一的属性。

private int value;

public int getValue() {

return value;

}

//在更改属性时出发事件。

public void setValue(int value) {

try{

int oldValue = this.value;

//出发投票事件。

vetoableChanges.fireVetoableChange("value", oldValue, value);

//触发属性更改事件。

changes.firePropertyChange("value", oldValue, value);

this.value = value;

}catch(Exception e){//当在事件监听器中发生异常时忽略本次属性赋值操作。

e.printStackTrace();

}

}

}

投票否决监听器的例子代码如下所示:

/**   

* @Title: VetoableListenerTest.java

* @Package com.test.javatechnology.introspection

* @Description:

* @author http://www.cnblogs.com/coe2coe/

* @date 2017年3月25日 下午6:27:53

* @version V1.0   

*/

package com.test.javatechnology.introspection;

import java.beans.PropertyChangeEvent;

import java.beans.PropertyChangeListener;

import java.beans.PropertyVetoException;

import java.beans.VetoableChangeListener;

/**

* @ClassName: VetoableListenerTest

* @Description:

* @author http://www.cnblogs.com/coe2coe/

* @date 2017年3月25日 下午6:27:53

*  

*/

public class VetoableListenerTest {

/**

 * @param args

 */

public static void main(String[] args) {

//创建Java Bean的实例。

VetoableEventBean  obj = new VetoableEventBean();

//添加否决投票事件监听器。

obj.addListener("value", new VetoableChangeListener(){

@Override

public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {

System.out.println("veto:"

 + "property:" + evt.getPropertyName()

 + " oldValue:"  + evt.getOldValue()

 + " newValue:"  + evt.getNewValue());

//当属性值为3时否决。

if( evt.getNewValue().equals(3)){

throw new PropertyVetoException("new value must not equal 3\r\n",evt);

}

}

});

//添加属性改变事件监听器。

obj.addListener("value", new PropertyChangeListener(){

@Override

public void propertyChange(PropertyChangeEvent evt) {

//输出属性的名称,旧值,新值。

System.out.println("propertyChange:"

 + "property:" + evt.getPropertyName()

 + " oldValue:"  + evt.getOldValue()

 + " newValue:"  + evt.getNewValue());

}

});

//设置新值。

obj.setValue(1);

System.out.println("value:" + obj.getValue());

//将不会改变

obj.setValue(3);

System.out.println("value:" + obj.getValue());

}

}

在投票监听器的事件处理中当新值为3时,通过抛出VetoException异常阻止了赋值的操作。

运行结果如下:

veto:property:value oldValue:0 newValue:1

propertyChange:property:value oldValue:0 newValue:1

value:1

veto:property:value oldValue:1 newValue:3

java.beans.PropertyVetoException: new value must not equal 3

value:1

at com.test.javatechnology.introspection.VetoableListenerTest$1.vetoableChange(VetoableListenerTest.java:44)

at java.beans.VetoableChangeSupport.fireVetoableChange(Unknown Source)

at java.beans.VetoableChangeSupport.fireVetoableChange(Unknown Source)

at java.beans.VetoableChangeSupport.fireVetoableChange(Unknown Source)

at com.test.javatechnology.introspection.VetoableEventBean.setValue(VetoableEventBean.java:75)

at com.test.javatechnology.introspection.VetoableListenerTest.main(VetoableListenerTest.java:68)

时间: 2024-12-15 01:39:51

Java重要技术(15)内省之属性改变事件和投票否决事件的相关文章

Java重要技术(13)内省之属性描述符PropertyDescriptor

1.1. 属性描述符(PropertyDescriptor) 可以使用PropertyDescrptor类来访问Java Bean的属性和方法. Object obj; Class beanClass = SampleBean.class; Object value; PropertyDescriptor propertyDescriptor; try { //创建对象 obj = SampleBean.class.newInstance(); //访问age属性. propertyDescri

Java重要技术(12)内省之JavaBean

1.1. Java Bean Java Bean是一种符合特定的规则的类.至少符合以下规则: (1)类本身是public修饰的. (2)类具有public无参数构造函数. (3)类通过某种规范化的getXXX()和setXXX()方法来暴露其属性XXX. 主要细则: (a)属性一般为private,而get和set方法为public. (b)属性名的第1个字母转化为大写后在前面加上get和set,就是该属性的get和set方法名称.属性XXX对应方法为getXXX(),setXXX().属性xy

java 反射技术---- class类名获取属性

getFields()   -----------    获取类的.父类的所有public 属性: getDeclaredFields() ----------- 获取类的所有public .protected .private 属性: 那么根据API 类是获取不到父类的protected.private 属性的,如果要获取那么需要通过父类使用反射.

Java多线程技术学习笔记(二)

目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和wait的区别 停止线程的方式 守护线程 线程的其他知识点 一.线程间的通信示例 返目录回 多个线程在处理同一资源,任务却不同. 假设有一堆货物,有一辆车把这批货物往仓库里面运,另外一辆车把前一辆车运进仓库的货物往外面运.这里货物就是同一资源,但是两辆车的任务却不同,一个是往里运,一个是往外运. 下面

理解Java的反射与内省及其区别

java的内省机制和反射机制什么区别 内省操作只针对JavaBean,只有符合JavaBean规则的类的成员才可以采用内省API进行操作....而反射则不同,一个类的所有成员都可以进行反射操作. 内省和反射的操作也有很大不同,内省是先得到属性描述器PropertyDecriptor后再进行各种操作,反射则是先得到类的字节码Class后再进行各种操作的. 反射(reflection)(实现可扩展性智能化) 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对

【Java】Java XML 技术专题

XML 基础教程 XML 和 Java 技术 Java XML文档模型 JAXP(Java API for XML Parsing) StAX(Streaming API for XML) XJ(XML Enhancements for Java) XML 验证 XPath XQuery XSL 转换处理器 XStream 数据绑定 本专题汇总了大量面向 Java 开发人员的 XML 技术文章和教程,内容涉及 XML 基础.Java XML 的文档模型.编程 API 与数据绑定框架以及 Java

小怪兽 Java反射技术 等你来打

Java反射技术,是java的难点,也是程序员进化过程中的必打小怪兽,这里就根据java api好好研究一下java的反射技术. Class Fields Methods 请先回忆一下[java类的定义]. 一.反射是什么 反射是什么?百度百科这样定义:JAVA反射机制是在运行状态下,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取对象信息以及动态调用对象方法的功能称为java语言的反射机制. 可以这样理解,大家小时候有木有玩过平

(转)java缓存技术,记录

http://blog.csdn.net/madun/article/details/8569860 最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考.此为转贴,帖子来处:http://cogipard.info/articles/cache-static-files-with-jnotify-and-ehcache 介绍 JNotify:http://jnotify.sourceforge.net/,通过JNI

Java多线程面试15道

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并发的.下面这些是我在不同时间不同地点喜欢问的Jav