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

com.packenius.datadivider.javaclass.cp.CpFieldRef Maven / Gradle / Ivy

package com.packenius.datadivider.javaclass.cp;

import com.packenius.datadivider.javaclass.ConstantPool;
import com.packenius.datadivider.javaclass.ConstantPoolEntryCrossPointer;
import com.packenius.dumpapi.DumpReader;
import com.packenius.dumpapi.DumpReader.BigEndianUnsigned2ByteInteger;

/**
 * Beschreibt einen Eintrag eines Konstanten-Pools einer class-Struktur, in dem
 * ein Feld beschrieben wird.
 * @author Christian Packenius, 2016.
 */
public class CpFieldRef extends ConstantPoolEntry {
    /**
     * Index im Konstantenpool auf eine Klasse.
     */
    public final int classIndex;

    /**
     * Index im Konstantenpool auf einen Namen und einen Typ.
     */
    public final int nameAndTypeIndex;

    /**
     * Konstruktor.
     */
    public CpFieldRef(DumpReader reader, int id, ConstantPool constantpool) {
        super(reader, id);

        BigEndianUnsigned2ByteInteger classIndexDumpBlock = reader.readBigEndianU2("Class index: ###DEC##");
        classIndexDumpBlock.setCrossPointer(new ConstantPoolEntryCrossPointer(classIndexDumpBlock.value));
        classIndex = classIndexDumpBlock.value;

        BigEndianUnsigned2ByteInteger natDumpBlock = reader.readBigEndianU2("Name and type index: ###DEC##");
        natDumpBlock.setCrossPointer(new ConstantPoolEntryCrossPointer(natDumpBlock.value));
        nameAndTypeIndex = natDumpBlock.value;

        setEndAddress(reader);
    }

    /**
     * Ermittelt den Namen des hier beschriebenen Feldes.
     */
    public String getFieldName() {
        ConstantPool constantpool = reader.getUserObject(ConstantPool.class);
        CpNameAndType nat = constantpool.getNameAndTypeEntry(nameAndTypeIndex);
        return constantpool.getEntry(nat.nameIndex).asUtf8().string;
    }

    /**
     * Ermittelt den Namen der Klasse des hier beschriebenen Feldes.
     */
    public String getClassName() {
        return reader.getUserObject(ConstantPool.class).getEntry(classIndex).asClass().getClassName();
    }

    @Override
    public String getDescription() {
        return "Constant pool entry #" + id + "\r\nField reference constant, class #" + classIndex + ", name and type #"
                + nameAndTypeIndex;
    }

    @Override
    public String toString() {
        ConstantPool cp = reader.getUserObject(ConstantPool.class);
        String className = getClassName();
        CpNameAndType nat = (CpNameAndType) cp.getEntry(nameAndTypeIndex);
        String fieldType = nat.getFieldType();
        String fieldName = nat.getName();
        return "Field reference: " + fieldType + " " + className + "." + fieldName + " [#" + id + "]";
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy