ConstructorInfo GetPeerConstructor(JniObjectReference instance, Type fallbackType)
            {
                var klass       = JniEnvironment.Types.GetObjectClass(instance);
                var jniTypeName = JniEnvironment.Types.GetJniTypeNameFromClass(klass);

                Type type = null;

                while (jniTypeName != null)
                {
                    type = Runtime.TypeManager.GetType(JniTypeSignature.Parse(jniTypeName));

                    if (type != null)
                    {
                        var ctor = GetActivationConstructor(type);

                        if (ctor != null)
                        {
                            JniObjectReference.Dispose(ref klass);
                            return(ctor);
                        }
                    }

                    var super = JniEnvironment.Types.GetSuperclass(klass);
                    jniTypeName = super.IsValid
                                                ? JniEnvironment.Types.GetJniTypeNameFromClass(super)
                                                : null;

                    JniObjectReference.Dispose(ref klass, JniObjectReferenceOptions.CopyAndDispose);
                    klass = super;
                }
                JniObjectReference.Dispose(ref klass, JniObjectReferenceOptions.CopyAndDispose);

                return(GetActivationConstructor(fallbackType));
            }
            internal Type GetRuntimeType(JniObjectReference reference)
            {
                var signature = JniTypeSignature.Parse(JniEnvironment.Types.GetJniTypeNameFromInstance(reference));

                return(Runtime.TypeManager.GetType(signature));
            }