33import java .lang .reflect .InvocationTargetException ;
44import java .lang .reflect .Method ;
55import java .lang .reflect .Proxy ;
6+ import java .util .EventListener ;
67import java .util .List ;
78import java .util .concurrent .CopyOnWriteArrayList ;
89
9- public class Announcer {
10+ public class Announcer < T extends EventListener > {
1011
11- private HealthMonitor proxy ;
12- private List <HealthMonitor > listeners = new CopyOnWriteArrayList <>();
12+ private T proxy ;
13+ private List <T > listeners = new CopyOnWriteArrayList <>();
1314
14- public Announcer (Class <HealthMonitor > listenerType ) {
15+ public Announcer (Class <T > listenerType ) {
1516 proxy = createProxy (listenerType );
1617 }
1718
18- private HealthMonitor createProxy (Class <HealthMonitor > listenerType ) {
19+ private T createProxy (Class <T > listenerType ) {
1920 return listenerType .cast (Proxy .newProxyInstance (listenerType .getClassLoader (),
2021 new Class <?>[] {listenerType }, (proxy , method , args ) -> {
2122 invokeAll (method , args );
@@ -24,7 +25,7 @@ private HealthMonitor createProxy(Class<HealthMonitor> listenerType) {
2425 }
2526
2627 private void invokeAll (Method method , Object [] args ) {
27- for (HealthMonitor listener : listeners ) {
28+ for (T listener : listeners ) {
2829 try {
2930 method .invoke (listener , args );
3031 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e ) {
@@ -33,15 +34,19 @@ private void invokeAll(Method method, Object[] args) {
3334 }
3435 }
3536
36- public void registerListener (HealthMonitor listener ) {
37+ public void registerListener (T listener ) {
3738 listeners .add (listener );
3839 }
3940
40- public HealthMonitor announce () {
41+ public T announce () {
4142 return proxy ;
4243 }
4344
44- public void removeListener (HealthMonitor listener ) {
45+ public void removeListener (T listener ) {
4546 listeners .remove (listener );
4647 }
48+
49+ public static <T extends EventListener > Announcer <T > to (Class <T > listenerType ) {
50+ return new Announcer <>(listenerType );
51+ }
4752}
0 commit comments