package org.foo.spoke; import java.lang.reflect.Method; import org.foo.hub.Message; import org.foo.hub.spi.Spoke; /** * Spoke that audits matching messages using the hub's own Auditor class. */ public class SpokeImpl implements Spoke { String address; public SpokeImpl(String address) { this.address = address; } public boolean receive(Message message) { if (address.matches(message.getAddress())) { Class msgClazz = message.getClass(); String auditorName = msgClazz.getPackage().getName() + ".Auditor"; try { // attempt to load the hub's own Auditor class using Class.forName (boo!) Class auditClazz = Class.forName(auditorName); // NOTE: loadClass is preferred as it works better with OSGi dynamics // Class auditClazz = msgClazz.getClassLoader().loadClass(auditorName); Method method = auditClazz.getDeclaredMethod("audit", Spoke.class, Message.class); method.invoke(null, this, message); return true; } catch (Throwable e) { e.printStackTrace(); return false; } } return false; } }