Ejemplo n.º 1
0
        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;
                }
            }
        }
Ejemplo n.º 2
0
        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;
                }
            }
        }
Ejemplo n.º 3
0
        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;
                }
            }
        }