public static void Load(this JavaClass kls, XmlReader reader)
        {
            reader.MoveToContent();
            kls.LoadTypeAttributes(reader, "extends", "extends-generic-aware", "jni-extends");
            // they are not mandatory; Java.Lang.Object doesn't have them.
            kls.Extends            = reader.GetAttribute("extends");
            kls.ExtendsGeneric     = reader.GetAttribute("extends-generic-aware");
            kls.ExtendedJniExtends = reader.GetAttribute("jni-extends");

            reader.MoveToElement();
            if (reader.IsEmptyElement)
            {
                reader.Read();
            }
            else
            {
                reader.Read();
                do
                {
                    reader.MoveToContent();
                    if (reader.NodeType == XmlNodeType.EndElement)
                    {
                        break;                         // </interface>
                    }
                    if (reader.NodeType != XmlNodeType.Element)
                    {
                        throw XmlUtil.UnexpectedElementOrContent("class", reader, "implements", "typeParameters", "field", "constructor", "method");
                    }
                    if (!kls.TryLoadCommonElement(reader))
                    {
                        if (reader.LocalName == "constructor")
                        {
                            var constructor = new JavaConstructor(kls);
                            constructor.Load(reader);
                            kls.Members.Add(constructor);
                        }
                        else
                        {
                            throw XmlUtil.UnexpectedElementOrContent("class", reader, "implements", "typeParameters", "field", "constructor", "method");
                        }
                    }
                } while (true);
                XmlUtil.VerifyEndElement(reader, "class");
                reader.Read();
            }
        }
        static void Load(this JavaClass kls, ClassGen gen)
        {
            ((JavaType)kls).Load(gen);

            kls.Abstract = gen.IsAbstract;
            kls.Final    = gen.IsFinal;
            if (gen.BaseGen != null)
            {
                kls.Extends            = gen.BaseGen.JavaSimpleName;
                kls.ExtendsGeneric     = gen.BaseGen.JavaSimpleName + ExpandTypeParameters(gen.BaseGen.TypeParameters);
                kls.ExtendedJniExtends = gen.BaseGen.JniName;
            }
            foreach (var c in gen.Ctors)
            {
                var ctor = new JavaConstructor(kls);
                ctor.Load(c);
                kls.Members.Add(ctor);
            }
        }
        static void Load(this JavaClass kls, ClassGen gen)
        {
            ((JavaType)kls).Load(gen);

            kls.Abstract = gen.IsAbstract;
            kls.Final    = gen.IsFinal;
            var baseGen = gen.BaseType != null?SymbolTable.Lookup(gen.BaseType) : null;

            if (baseGen != null)
            {
                kls.Extends = baseGen.JavaName;
                var gs = baseGen as GenericSymbol;
                kls.ExtendsGeneric     = gs != null ? gs.JavaName + ExpandTypeParameters(gs.TypeParams) : baseGen.JavaName;
                kls.ExtendedJniExtends = baseGen.JniName;
            }
            foreach (var c in gen.Ctors)
            {
                var ctor = new JavaConstructor(kls);
                ctor.Load(c);
                kls.Members.Add(ctor);
            }
        }