import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; public class ListenerSupport implements InvocationHandler { protected final T target; @SuppressWarnings("unchecked") public ListenerSupport(Class listenerInterface) { this.target=(T) Proxy.newProxyInstance(listenerInterface.getClassLoader(), new Class[] {listenerInterface}, this); } public static ListenerSupport create(Class listenerInterface) { return new ListenerSupport(listenerInterface); } protected List listeners=new ArrayList(); public void add(T listener) { if (listeners.contains(listener)) return; synchronized(listeners) { listeners.add(listener); } } public void remove(T listener) { synchronized(listeners) { listeners.remove(listener); } } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object ret=null; synchronized(listeners) { for (T l: listeners) { ret=method.invoke(l, args); } } return ret; } public T target() { return target; } }