public JavaClassImage(JavaClassFile classFile) { ClassFile = classFile; RootClass = new ClassDefinition(this); MajorVersion = classFile.MajorVersion; MinorVersion = classFile.MinorVersion; // Attributes foreach (var attr in classFile.Attributes) { string name = classFile.ConstantPool.ResolveString(attr.NameIndex); switch (name) { // Source file case SingleIndexAttribute.SourceFileAttribute: _sourceFile = new LazyValue <string>(() => { var sourceFile = SingleIndexAttribute.FromReader(name, new MemoryBigEndianReader(attr.Contents)); return(classFile.ConstantPool.ResolveString(sourceFile.ConstantPoolIndex)); }); break; case BootstrapMethodsAttribute.AttributeName: _bootstrapMethodsAttribute = BootstrapMethodsAttribute.FromReader(new MemoryBigEndianReader(attr.Contents)); break; default: ExtraAttributes.Add(name, attr.Clone()); break; } } }
internal FieldDefinition(JavaClassImage classImage, FieldInfo fieldInfo) { // Name _name = new LazyValue <string>(() => classImage.ClassFile.ConstantPool.ResolveString(fieldInfo.NameIndex) ?? $"<<<INVALID({fieldInfo.NameIndex})>>>"); // Access flags. AccessFlags = fieldInfo.AccessFlags; // Descriptor. _descriptor = new LazyValue <FieldDescriptor>(() => classImage.ResolveFieldDescriptor(fieldInfo.DescriptorIndex)); // Extra attributes. foreach (var attr in fieldInfo.Attributes) { string name = classImage.ClassFile.ConstantPool.ResolveString(attr.NameIndex); switch (name) { case SingleIndexAttribute.ConstantValueAttribute: // Constant _constant = new LazyValue <object>(() => { var contents = SingleIndexAttribute.FromReader(name, new MemoryBigEndianReader(attr.Contents)); var constantInfo = classImage.ClassFile.ConstantPool.ResolveConstant(contents.ConstantPoolIndex); switch (constantInfo) { case PrimitiveInfo primitiveInfo: return(primitiveInfo.Value); case StringInfo stringInfo: return(classImage.ClassFile.ConstantPool.ResolveString(stringInfo.StringIndex)); default: return(null); } }); break; default: // Fall back method: ExtraAttributes.Add(classImage.ClassFile.ConstantPool.ResolveString(attr.NameIndex), attr.Clone()); break; } } }
internal ClassDefinition(JavaClassImage classImage) : base(classImage, (ClassInfo)classImage.ClassFile.ConstantPool.ResolveConstant(classImage.ClassFile.ThisClass)) { Image = classImage; // Super class _superClass = new LazyValue <ClassReference>(() => classImage.ClassFile.SuperClass != 0 ? new ClassReference(classImage, (ClassInfo)classImage.ClassFile.ConstantPool.ResolveConstant(classImage.ClassFile.SuperClass)) : null); // Flags AccessFlags = classImage.ClassFile.AccessFlags; // Fields Fields = new FieldCollection(this); foreach (var field in classImage.ClassFile.Fields) { Fields.Add(new FieldDefinition(classImage, field)); } // Methods Methods = new MethodCollection(this); foreach (var method in classImage.ClassFile.Methods) { Methods.Add(new MethodDefinition(classImage, method)); } // Attributes foreach (var attr in classImage.ClassFile.Attributes) { string name = classImage.ClassFile.ConstantPool.ResolveString(attr.NameIndex); switch (name) { // Source file case SingleIndexAttribute.SourceFileAttribute: _sourceFile = new LazyValue <string>(() => { var sourceFile = SingleIndexAttribute.FromReader(name, new MemoryBigEndianReader(attr.Contents)); return(classImage.ClassFile.ConstantPool.ResolveString(sourceFile.ConstantPoolIndex)); }); break; default: ExtraAttributes.Add(name, attr.Clone()); break; } } }