All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.packenius.datadivider.javaclass.Attributes Maven / Gradle / Ivy

package com.packenius.datadivider.javaclass;

import java.util.ArrayList;
import java.util.List;

import com.packenius.datadivider.javaclass.attr.AnnotationDefaultAttribute;
import com.packenius.datadivider.javaclass.attr.AttributeDescription;
import com.packenius.datadivider.javaclass.attr.BootstrapMethodsAttribute;
import com.packenius.datadivider.javaclass.attr.CodeAttribute;
import com.packenius.datadivider.javaclass.attr.ConstantValueAttribute;
import com.packenius.datadivider.javaclass.attr.DeprecatedAttribute;
import com.packenius.datadivider.javaclass.attr.EnclosingMethodAttribute;
import com.packenius.datadivider.javaclass.attr.ExceptionsAttribute;
import com.packenius.datadivider.javaclass.attr.InnerClassesAttribute;
import com.packenius.datadivider.javaclass.attr.LineNumberTableAttribute;
import com.packenius.datadivider.javaclass.attr.LocalVariableTableAttribute;
import com.packenius.datadivider.javaclass.attr.LocalVariableTypeTableAttribute;
import com.packenius.datadivider.javaclass.attr.RuntimeInvisibleAnnotationsAttribute;
import com.packenius.datadivider.javaclass.attr.RuntimeInvisibleParameterAnnotationsAttribute;
import com.packenius.datadivider.javaclass.attr.RuntimeInvisibleTypeAnnotationsAttribute;
import com.packenius.datadivider.javaclass.attr.RuntimeVisibleAnnotationsAttribute;
import com.packenius.datadivider.javaclass.attr.RuntimeVisibleParameterAnnotationsAttribute;
import com.packenius.datadivider.javaclass.attr.RuntimeVisibleTypeAnnotationsAttribute;
import com.packenius.datadivider.javaclass.attr.SignatureAttribute;
import com.packenius.datadivider.javaclass.attr.SourceDebugExtensionAttribute;
import com.packenius.datadivider.javaclass.attr.SourceFileAttribute;
import com.packenius.datadivider.javaclass.attr.StackMapTableAttribute;
import com.packenius.datadivider.javaclass.attr.SyntheticAttribute;
import com.packenius.datadivider.javaclass.attr.UserDefinedAttribute;
import com.packenius.datadivider.javaclass.cp.CpUtf8;
import com.packenius.dumpapi.DumpBlock;
import com.packenius.dumpapi.DumpReader;

/**
 * Menge von Attributen (z.B. einer Klasse).
 * @author Christian Packenius, 2016.
 */
public class Attributes extends DumpBlock {
    /**
     * Alle verfügbaren Attribute.
     */
    public final List attributes = new ArrayList<>();

    /**
     * Konstruktor.
     */
    public Attributes(DumpReader reader) {
        super(reader);
        int attributesCount = reader.readBigEndianU2("Attributes count: ##DEC##").value;
        for (int i = 0; i < attributesCount; i++) {
            attributes.add(readNextAttribute(reader));
        }
        setEndAddress(reader);
    }

    /**
     * Liest das nächste Attribut aus der Klasse.
     * @return Attributobjekt.
     */
    private AttributeDescription readNextAttribute(DumpReader reader) {
        ConstantPool cp = reader.getUserObject(ConstantPool.class);

        // Jedes Attribut enthält zuerst einen Namen und dann eine 4-Byte-Länge.
        int utf8Index = reader.readBigEndianU2("Attribute name index: ###DEC##").value;
        CpUtf8 utf8 = cp.getUtf8Entry(utf8Index);

        int length = (int) reader.readBigEndianU4("Attribute length: ##DEC##");

        reader.deltaIndex(-6);

        switch (utf8.string) {
        case "ConstantValue":
            return new ConstantValueAttribute(length, reader);
        case "Signature":
            return new SignatureAttribute(length, reader);
        case "SourceFile":
            return new SourceFileAttribute(length, reader);
        case "LineNumberTable":
            return new LineNumberTableAttribute(length, reader);
        case "LocalVariableTable":
            return new LocalVariableTableAttribute(length, reader);
        case "LocalVariableTypeTable":
            return new LocalVariableTypeTableAttribute(length, reader);
        case "StackMapTable":
            return new StackMapTableAttribute(length, reader);
        case "Code":
            return new CodeAttribute(length, reader);
        case "Exceptions":
            return new ExceptionsAttribute(length, reader);
        case "InnerClasses":
            return new InnerClassesAttribute(length, reader);
        case "EnclosingMethod":
            return new EnclosingMethodAttribute(length, reader);
        case "RuntimeVisibleAnnotations":
            return new RuntimeVisibleAnnotationsAttribute(length, reader);
        case "RuntimeInvisibleAnnotations":
            return new RuntimeInvisibleAnnotationsAttribute(length, reader);
        case "RuntimeVisibleParameterAnnotations":
            return new RuntimeVisibleParameterAnnotationsAttribute(length, reader);
        case "RuntimeInvisibleParameterAnnotations":
            return new RuntimeInvisibleParameterAnnotationsAttribute(length, reader);
        case "Deprecated":
            return new DeprecatedAttribute(length, reader);
        case "Synthetic":
            return new SyntheticAttribute(length, reader);
        case "AnnotationDefault":
            return new AnnotationDefaultAttribute(length, reader);
        case "BootstrapMethods":
            return new BootstrapMethodsAttribute(length, reader);
        case "SourceDebugExtension":
            return new SourceDebugExtensionAttribute(length, reader);
        case "RuntimeVisibleTypeAnnotations":
            return new RuntimeVisibleTypeAnnotationsAttribute(length, reader);
        case "RuntimeInvisibleTypeAnnotations":
            return new RuntimeInvisibleTypeAnnotationsAttribute(length, reader);
        case "MethodParameters":
            throw new RuntimeException("TODO!");
        default:
            return new UserDefinedAttribute(length, reader, utf8.string);
        }
    }

    /**
     * @param name Name des Attributes.
     * @return Attribute oder null, falls nicht gefunden.
     */
    public AttributeDescription getAttributeByName(String name) {
        for (AttributeDescription attr : attributes) {
            if (name.equals(attr.getName())) {
                return attr;
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return "Attributes [" + attributes.size() + " entries]";
    }

    @Override
    public String getDescription() {
        return "All attributes of this class definition.";
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy