rendered paste bodyimport 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<T> implements InvocationHandler{ protected final T target; @SuppressWarnings("unchecked") public ListenerSupport(Class<? extends T> listenerInterface) { this.target=(T) Proxy.newProxyInstance(listenerInterface.getClassLoader(), new Class[] {listenerInterface}, this); } public static <T> ListenerSupport<T> create(Class<? extends T> listenerInterface) { return new ListenerSupport<T>(listenerInterface); } protected List<T> listeners=new ArrayList<T>(); 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; }}