Dashboard
>
Public Content
>
...
Home
>
JavaStuff
>
Announcer
Public Content
Log In
Announcer
Browse Space
View
I
nfo
Added by
James Richardson
, last edited by
James Richardson
on Jul 12, 2007 (
view change
)
Labels:
(None)
Add Labels
Enter labels to add to this page:
Tip:
Looking for a label? Just start typing.
import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.EventListener; import java.util.List; public class Announcer<T extends EventListener> { private final T proxy; private final List<T> listeners = new ArrayList<T>(); public Announcer(Class<? extends T> listenerType) { proxy = listenerType.cast(Proxy.newProxyInstance( getClass().getClassLoader(), new Class<?>[]{listenerType}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { announce(method, args); return null; } })); } public void addListener(T listener) { listeners.add(listener); } public void removeListener(T listener) { listeners.remove(listener); } public T announce() { return proxy; } private void announce(Method m, Object[] args) { try { for (T listener : listeners) { m.invoke(listener, args); } } catch (IllegalAccessException e) { throw new IllegalArgumentException("could not invoke listener", e); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); if (cause instanceof RuntimeException) { throw (RuntimeException)cause; } else if (cause instanceof Error) { throw (Error)cause; } else { throw new UnsupportedOperationException("listener threw exception", cause); } } } public static <T extends EventListener> Announcer<T> to(Class<? extends T> listenerType) { return new Announcer<T>(listenerType); } }
Add Comment
Powered by
Atlassian Confluence
, the
Enterprise Wiki
. (Version: 2.5.1 Build:#806 May 06, 2007) -
Bug/feature request
-
Contact Administrators