Java PropertyChangeListener

/**
 * Project Name:Micro-Services-RPC-Message
 * File Name   :PropertyChangeListener.java
 * Package Name:test.event
 * Date:2015-9-9上午10:02:40
 * Copyright (c) 2015, http://my.oschina.net/httpssl All Rights Reserved.
 *
*/

package test.event;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.io.PrintStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;

import org.apache.commons.lang3.event.EventListenerSupport;
import org.apache.commons.lang3.reflect.FieldUtils;

import com.micro.services.common.utils.ReflectUtils;

/**
 * ClassName:PropertyChangeListener <br/>
 * Function :TODO ADD 测试 学习 对象属性监听. <br/>
 * Reason	:TODO PropertyChangeEvent,VetoableChangeListener. <br/>
 * Date     :2015-9-9 上午10:02:40 <br/>
 * @author  :http://my.oschina.net/httpssl
 * @since   :JDK 1.7
 * @see
 */
public class PropertyChangeListener
{
	public static class EventWorker{

		public static final String PROP_WORKSTATE = "workState";

		private final int id;
		private final String name;
		private volatile String workState ;
		public EventWorker(int id, String name)
		{
			super();
			this.id = id;
			this.name = name;
		}
		public EventWorker(int id, String name, String workState)
		{
			super();
			this.id = id;
			this.name = name;
			this.workState = workState;
		}
		public String getWorkState() {
			return workState;
		}
		public void setWorkState(String workState) {
			this.workState = workState;
		}

	}

	public static void main(String[] args) throws PropertyVetoException {
		final EventListenerSupport<VetoableChangeListener> listenerSupport = EventListenerSupport.create(VetoableChangeListener.class);
//		listenerSupport.addListener(null);//不能添加一个null对象
//		listenerSupport.removeListener(null);//不能移除一个null

		VetoableChangeListener newVetoableChangeListener = new VetoableChangeListener()
		{
			/*
			 *
			 * TODO VetoableChangeListener 监听对象 触发属性 change时触发
			 * @see java.beans.VetoableChangeListener#vetoableChange(java.beans.PropertyChangeEvent)
			 */
			@Override
			public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
				PrintStream stream = System.err;
				if(!ReflectUtils.isPrimitive(evt.getSource().getClass())){
					try {
						Field field = evt.getSource().getClass().getDeclaredField(evt.getPropertyName());
						 //
						 if (!field.isAccessible()) {
								field.setAccessible(true);
						 }
						 FieldUtils.writeField(field, evt.getSource(), evt.getNewValue());
					} catch (NoSuchFieldException e) {
						stream.append(e.getMessage());
					} catch (SecurityException e) {
						stream.append(e.getMessage());
					} catch (IllegalAccessException e) {
						stream.append(e.getMessage());
					} finally{
						stream.println();
					}
					System.out.println(evt.getPropertyName()+" "+evt.getOldValue()+"  -> "+evt.getNewValue());
				}
			}
		};

		EventWorker developer = new EventWorker(1,"开发A","正在开发");

		listenerSupport.addListener(newVetoableChangeListener);
		//一定要写在addListener 后
		listenerSupport.fire().vetoableChange(new PropertyChangeEvent(developer,EventWorker.PROP_WORKSTATE,developer.getWorkState(),"完成了"));

		System.out.println("在方法外 查看:::"+developer.getWorkState());

		final EventListenerSupport<VetoableChangeListener> eventListenerSupport2 = new EventListenerSupport<VetoableChangeListener>(VetoableChangeListener.class){

			private static final long	serialVersionUID	= 1L;

			protected java.lang.reflect.InvocationHandler createInvocationHandler() {
				return new ProxyInvocationHandler(){
					/*
					 *
					 * TODO 简单描述该方法的实现功能(可选).
					 * @see org.apache.commons.lang3.event.EventListenerSupport.ProxyInvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
					 */
					@Override
					public Object invoke(Object proxy, Method method, Object[] args)
							throws Throwable {
						return super.invoke(proxy, method, args);
					}
				};
			}

		};

		final VetoableChangeListener listener = new VetoableChangeListener()
		{
			@Override
			public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
				System.out.println(evt.getPropertyName()+" "+evt.getOldValue()+"  -> "+evt.getNewValue());
			}
		};
		eventListenerSupport2.addListener(listener);
		final Date source = new Date();

		final PropertyChangeEvent ignore = new PropertyChangeEvent(source, "Hour", 5, 6);
        final PropertyChangeEvent respond = new PropertyChangeEvent(source, "Day", 6, 7);
        listener.vetoableChange(respond);
        eventListenerSupport2.fire().vetoableChange(ignore);
        eventListenerSupport2.fire().vetoableChange(respond);

	}

}
时间: 2024-08-18 20:06:15

Java PropertyChangeListener的相关文章

java.beans.PropertyChangeListener

1 import java.beans.PropertyChangeEvent; 2 import java.beans.PropertyChangeListener; 3 import java.beans.PropertyChangeSupport; 4 5 public class DemoBeans { 6 7 private String demoName; 8 private String Version; 9 PropertyChangeSupport listeners = ne

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 */

Java 日志缓存机制的实现--转载

概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印的日志级别,这样就会带来一些不便. 在 JDK 提供的日志功能中,日志级别被细化为 9 级,用以区分不同日志的用途,用来记录一个错误,或者记录正常运行的信息,又或是记录详细的调试信息.由于日志级别是静态的,如果日志级别设定过高,低级别的日志难以打印出来,从而导致在错误发生时候,难以去追踪错误的发生原

java语法糖

语法糖 Java语法糖系列,所以首先讲讲什么是语法糖.语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了.这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能.或能提升语法的严谨性.或能减少编码出错的机会.Java提供给了用户大量的语法糖,比如泛型.自动装箱.自动拆箱.foreach循环.变长参数.内部类.枚举类.断言(assert)等 断言(as

Java Swing中的SwingWorker

Swing中的SwingWorker主要是用来执行比较耗时的任务. Java doc文档中中包含了一些简单的例子. An abstract class to perform lengthy GUI-interaction tasks in a background thread. Several background threads can be used to execute such tasks. However, the exact strategy of choosing a threa

java设计模式--观察者模式和事件监听器模式

文章转载于:http://www.java2000.net/p9452 复习设计模式,看到observer观察者模式,说法是该模式和iterator迭代器模式类似已经被整合进jdk,但是jdk提供了两种接口: 一.java.util.Observer -- 观察者接口 对应: java.util.Observable --受查者根类 二.java.util.EventListener -- 事件监听/处理接口 对应: java.util.EventObject -- 事件(状态)对象根类 研究了

Java 语言结构【转】

Java 语言结构 基础:包(Package).类(Class)和对象(Object) 了解 Java 的包(Package).类(Class)和对象(Object)这些基础术语是非常重要的,这部分内容将概要的介绍这些术语. 包(Package) Java 使用包来组织类,通常按照业务逻辑将类分组到不同的包中.比如:应用程序的所有图形界面可能被分组到 com.vogella.webapplication.views 包中. 通常的做法是使用公司域名的倒序作为顶层包,比如:公司的域名是 "4byt

Java程序设计简介

这篇教程介绍了Java编程语言的安装和使用,并且包含一些编程实例. Java简介 历史 Java 编程语言由Sun微电子公司的James Gosling于1991年创建.1995年发布第一个版本(Java 1.0).2010年 Sun 微电子公司被 Oracle 公司收购,现在 Java 语言由 Oracle公司控制和管理.2006年Sun宣布Java遵循GNU General Public License (GPL), Oracle继续该项目,即OpenJDK.随着时间的推移,新的增强版本的

World Wind Java开发之十五——加载三维模型

之前的一篇博客是关于加载粗三维模型的,见http://blog.csdn.net/giser_whu/article/details/43452703,这个地方还存在着不能加载纹理的问题,一直没呢解决.那么WW如何加载常用的三维模型格式(3ds.obj.skp)呢,通过一番搜索,了解到WW可以加载collada的dae格式的三维模型,并且还可以加载kml\kmz文件,那么WW加载三维模型的方法就出来了:首先将其他格式三维模型转换为kmz或kml文件,再加载.这里我是从su的三维模型库中下载的sk