package jvm.classfile.field;
import jvm.classfile.AccessFlag;
import jvm.classfile.attribute.item.AttributeInfo;
import jvm.classfile.attribute.parser.AttributeParser;
import jvm.classfile.ConstantPool;
import jvm.classfile.constant.item.impl.UTF8Info;
import jvm.util.ByteCodeIterator;
import java.util.ArrayList;
import java.util.List;
public class Field {
private AccessFlag accessFlag;
private int nameIndex;
private int descriptorIndex;
private ConstantPool constantPool;
private List<AttributeInfo> attributes = new ArrayList<>();
public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool constantPool) {
this.accessFlag = new AccessFlag(accessFlag);
this.nameIndex = nameIndex;
this.descriptorIndex = descriptorIndex;
this.constantPool = constantPool;
}
public static Field parse(ByteCodeIterator iterator, ConstantPool constantPool) {
int access = iterator.nextU2ToInt();
int name = iterator.nextU2ToInt();
int descriptor = iterator.nextU2ToInt();
int attrCount = iterator.nextU2ToInt();
Field result = new Field(access, name, descriptor, constantPool);
for (int i = 0; i < attrCount; ++i) {
result.attributes.add(AttributeParser.parse(iterator, constantPool));
}
return result;
}
@Override
public String toString() {
return getName() + ":" + getDescriptor();
}
public AccessFlag getAccessFlag() {
return accessFlag;
}
public int getNameIndex() {
return nameIndex;
}
public int getDescriptorIndex() {
return descriptorIndex;
}
public ConstantPool getConstantPool() {
return constantPool;
}
public List<AttributeInfo> getAttributes() {
return attributes;
}
public String getName() {
return ((UTF8Info) constantPool.getConstantInfo(nameIndex)).getValue();
}
public String getDescriptor() {
return ((UTF8Info) constantPool.getConstantInfo(descriptorIndex)).getValue();
}
}