public void ReadTest()
        {
            var reader = new MemoryBigEndianReader(Bytes);

            Assert.Equal(8, reader.ReadByte());
            Assert.Equal(8, reader.ReadInt16());
            Assert.Equal(8, reader.ReadInt32());
            Assert.Equal(8, reader.ReadInt64());
            Assert.Throws <EndOfStreamException>(() => reader.ReadByte());
        }
        public void NoChange()
        {
            var reader = new MemoryBigEndianReader(Resources.HelloWorld);
            var classFile = JavaClassFile.FromReader(reader);

            using (var stream = new MemoryStream())
            {
                var writer = new BigEndianStreamWriter(stream);
                classFile.Write(new WritingContext(writer));
                Assert.Equal(Resources.HelloWorld, stream.ToArray());
            }

        }
        internal MethodDefinition(JavaClassImage classImage, MethodInfo methodInfo)
        {
            // Name
            _name = new LazyValue <string>(() =>
                                           classImage.ClassFile.ConstantPool.ResolveString(methodInfo.NameIndex) ?? $"<<<INVALID({methodInfo.NameIndex})>>>");

            // Flags
            AccessFlags = methodInfo.AccessFlags;

            //Descriptor
            _descriptor = new LazyValue <MethodDescriptor>(() =>
                                                           classImage.ResolveMethodDescriptor(methodInfo.DescriptorIndex));

            // Attributes
            foreach (var attribute in methodInfo.Attributes)
            {
                string name = classImage.ClassFile.ConstantPool.ResolveString(attribute.NameIndex);
                switch (name)
                {
                // Code
                case CodeAttribute.AttributeName:
                    _body = new LazyValue <ByteCodeMethodBody>(() =>
                    {
                        var reader = new MemoryBigEndianReader(attribute.Contents);
                        return(new ByteCodeMethodBody(classImage, CodeAttribute.FromReader(reader)));
                    });
                    break;

                // Exceptions
                case ExceptionsAttribute.AttributeName:
                    _exceptions = new LazyValue <IList <ClassReference> >(() =>
                    {
                        var reader = new MemoryBigEndianReader(attribute.Contents);
                        var attr   = ExceptionsAttribute.FromReader(reader);
                        return(attr.Exceptions
                               .Select(index => classImage.ResolveClass(index))
                               .ToList());
                    });
                    break;

                default:
                    ExtraAttributes.Add(name, attribute.Clone());
                    break;
                }
            }
        }
        public static JavaClassFile FromFile(string path)
        {
            var reader = new MemoryBigEndianReader(File.ReadAllBytes(path));

            return(FromReader(reader));
        }