/// <summary> /// Creates a <see cref="JavaClass"/> instance from bytes. /// </summary> /// <param name="stream">The stream to create the class file from.</param> /// <returns>A new <see cref="JavaClass"/> instance.</returns> public static JavaClass Create(Stream stream) { Guard.NotNull(ref stream, nameof(stream)); JavaClass result = new JavaClass(); result.Magic = stream.ReadInteger(); result.MinorVersion = stream.ReadShort(); result.MajorVersion = stream.ReadShort(); result.ConstantPoolCount = stream.ReadShort(); result.ConstantPool = ReadConstants(stream, result.ConstantPoolCount); result.AccessFlags = (JavaClassAccessFlags)stream.ReadShort(); result.ThisClassIndex = stream.ReadShort(); result.SuperClassIndex = stream.ReadShort(); result.InterfacesCount = stream.ReadShort(); result.Interfaces = stream.ReadShorts(result.InterfacesCount); result.FieldsCount = stream.ReadShort(); result.Fields = ReadFields(stream, result.FieldsCount, result.ConstantPool); result.MethodsCount = stream.ReadShort(); result.Methods = ReadMethods(stream, result.MethodsCount, result.ConstantPool); result.AttributesCount = stream.ReadShort(); result.Attributes = JavaAttribute.ReadFromStream(stream, result.AttributesCount, result.ConstantPool); return(result); }
/// <summary> /// Reads a method from the stream. /// </summary> /// <param name="stream">The stream to read from.</param> /// <param name="constantPool">The constant pool used for finding the attribute names.</param> /// <returns>The method read from the stream.</returns> private static JavaMethod ReadMethod(Stream stream, JavaConstantPool constantPool) { JavaMethodAccessFlags flags = (JavaMethodAccessFlags)stream.ReadShort(); ushort nameIndex = stream.ReadShort(); ushort descriptorIndex = stream.ReadShort(); ushort attributesCount = stream.ReadShort(); IJavaAttribute[] attributes = JavaAttribute.ReadFromStream(stream, attributesCount, constantPool); return(new JavaMethod(flags, nameIndex, descriptorIndex, attributesCount, attributes)); }
public static void SkipAll(ByteReader reader) { // ATTRIBUTE POOL LENGTH (U2) int length = reader.ReadShort(); for (int i = 0; i < length; i++) { JavaAttribute.Skip(reader); } }
public static JavaAttribute[] ReadAll(ByteReader reader, JavaConstant[] constants) { // ATTRIBUTE POOL LENGTH (U2) int length = reader.ReadShort(); JavaAttribute[] attributes = new JavaAttribute[length]; for (int i = 0; i < length; i++) { attributes[i] = JavaAttribute.Read(reader, constants); } return(attributes); }
public static JavaAttribute Read(ByteReader reader, JavaConstant[] constants) { // ATTRIBUTE NAME INDEX (U2) string tag = (string)constants[reader.ReadShort() - 1].Value; // ATTRIBUTE LENGTH (U4) int length = reader.ReadInt(); switch (tag) { case "RuntimeVisibleAnnotations": return(JavaAttribute.ReadRuntimeVisibleAnnotations(reader, constants)); default: reader.Skip(length); return(null); } }