diff --git a/src/dorkbox/network/connection/ConnectionManager.java b/src/dorkbox/network/connection/ConnectionManager.java index e5cb639a..00c24192 100644 --- a/src/dorkbox/network/connection/ConnectionManager.java +++ b/src/dorkbox/network/connection/ConnectionManager.java @@ -32,6 +32,7 @@ import dorkbox.network.connection.listenerManagement.OnIdleManager; import dorkbox.network.connection.listenerManagement.OnMessageReceivedManager; import dorkbox.util.ClassHelper; import dorkbox.util.Property; +import dorkbox.util.TypeResolver; import dorkbox.util.collections.ConcurrentEntry; // .equals() compares the identity on purpose,this because we cannot create two separate objects that are somehow equal to each other. @@ -124,23 +125,12 @@ class ConnectionManager implements Listeners, ISessionMana throw new IllegalArgumentException("listener cannot be null."); } - // find the class that uses Listener.class. - Class clazz = listener.getClass(); - -// Class[] interfaces = clazz.getInterfaces(); -// for (Class anInterface : interfaces) { -// } -// -// while (!(clazz.getSuperclass() != Object.class)) { -// clazz = clazz.getSuperclass(); -// } - - // this is the connection generic parameter for the listener - Class genericClass = ClassHelper.getGenericParameterAsClassForSuperClass(clazz, 0); + // this is the connection generic parameter for the listener, works for lambda expressions as well + Class genericClass = ClassHelper.getGenericParameterAsClassForSuperClass(Listener.class, listener.getClass(), 0); // if we are null, it means that we have no generics specified for our listener! //noinspection IfStatementWithIdenticalBranches - if (genericClass == this.baseClass || genericClass == null) { + if (genericClass == this.baseClass || genericClass == TypeResolver.Unknown.class || genericClass == null) { // we are the base class, so we are fine. addListener0(listener); return this; diff --git a/src/dorkbox/network/connection/listenerManagement/OnMessageReceivedManager.java b/src/dorkbox/network/connection/listenerManagement/OnMessageReceivedManager.java index 1dbf95a2..22f2f71e 100644 --- a/src/dorkbox/network/connection/listenerManagement/OnMessageReceivedManager.java +++ b/src/dorkbox/network/connection/listenerManagement/OnMessageReceivedManager.java @@ -15,9 +15,19 @@ */ package dorkbox.network.connection.listenerManagement; +import static dorkbox.util.collections.ConcurrentIterator.headREF; + +import java.lang.reflect.Type; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; + +import org.slf4j.Logger; + import com.esotericsoftware.kryo.util.IdentityMap; + import dorkbox.network.connection.Connection; import dorkbox.network.connection.ConnectionManager; +import dorkbox.network.connection.Listener; import dorkbox.network.connection.Listener.OnError; import dorkbox.network.connection.Listener.OnMessageReceived; import dorkbox.network.connection.Listener.SelfDefinedType; @@ -25,13 +35,6 @@ import dorkbox.network.rmi.RmiMessages; import dorkbox.util.ClassHelper; import dorkbox.util.collections.ConcurrentEntry; import dorkbox.util.collections.ConcurrentIterator; -import org.slf4j.Logger; - -import java.lang.reflect.Type; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; - -import static dorkbox.util.collections.ConcurrentIterator.headREF; /** * Called when the remote end has been connected. This will be invoked before any objects are received by the network. @@ -297,14 +300,15 @@ class OnMessageReceivedManager { * This works for compile time code. The generic type parameter #2 (index 1) is pulled from type arguments. * generic parameters cannot be primitive types */ - private static Class identifyType(final Object listener) { + private static + Class identifyType(final OnMessageReceived listener) { final Class clazz = listener.getClass(); - Class objectType = ClassHelper.getGenericParameterAsClassForSuperClass(clazz, 1); + Class objectType = ClassHelper.getGenericParameterAsClassForSuperClass(Listener.OnMessageReceived.class, clazz, 1); if (objectType != null) { // SOMETIMES generics get confused on which parameter we actually mean (when sub-classing) if (objectType != Object.class && ClassHelper.hasInterface(Connection.class, objectType)) { - Class objectType2 = ClassHelper.getGenericParameterAsClassForSuperClass(clazz, 2); + Class objectType2 = ClassHelper.getGenericParameterAsClassForSuperClass(Listener.OnMessageReceived.class, clazz, 2); if (objectType2 != null) { objectType = objectType2; }