package com.coderising.jvm.field;
import java.util.List;
import com.coderising.jvm.attr.AttributeInfo;
import com.coderising.jvm.constant.ConstantPool;
import com.coderising.jvm.constant.UTF8Info;
import com.coderising.jvm.loader.ByteCodeIterator;
public class Field {
private int accessFlag;// u2 access_flags
private int nameIndex;// u2 name_index
private int descriptorIndex;// u2 descriptor_index
private int attrCount;//u2 attributes_count
private List<AttributeInfo> attributeInfos;//attribute_info attributes[attributes_count];
private ConstantPool cp;
public Field(){}
public Field(int accessFlag, int nameIndex, int descriptorIndex,
int attrCount, ConstantPool cp) {
super();
this.accessFlag = accessFlag;
this.nameIndex = nameIndex;
this.descriptorIndex = descriptorIndex;
this.attrCount = attrCount;
this.cp = cp;
}
/**
* 读取字段<br/>
* field_info {<br/>
* u2 access_flags,<br/>
* u2 name_index,<br/>
* u2 descriptor_index,<br/>
* u2 attributes_count,<br/>
* attribute_info attributes[attributes_count]<br/>
* }
*
* @param itr
* @return Field
*/
public static Field parse(ConstantPool pool, ByteCodeIterator itr) {
int accessFlag = itr.nextU2toInt();
int nameIndex = itr.nextU2toInt();
int descriptorIndex = itr.nextU2toInt();
int attrCount = itr.nextU2toInt();
Field field = new Field(accessFlag, nameIndex, descriptorIndex, attrCount, pool);
for (int i = 0; i < attrCount; i++) {
field.addAttributeInfo(AttributeInfo.parse(pool, itr));
}
return field;
}
public void addAttributeInfo(AttributeInfo a) {
this.attributeInfos.add(a);
}
@Override
public String toString() {
UTF8Info utf8Info1 = (UTF8Info)this.cp.getConstantInfo(this.nameIndex);
UTF8Info utf8Info2 = (UTF8Info)this.cp.getConstantInfo(this.descriptorIndex);
return utf8Info1.getValue()+":"+utf8Info2.getValue();
}
/*
* getter setter
*/
public int getAccessFlag() {
return accessFlag;
}
public void setAccessFlag(int accessFlag) {
this.accessFlag = accessFlag;
}
public int getNameIndex() {
return nameIndex;
}
public void setNameIndex(int nameIndex) {
this.nameIndex = nameIndex;
}
public int getDescriptorIndex() {
return descriptorIndex;
}
public void setDescriptorIndex(int descriptorIndex) {
this.descriptorIndex = descriptorIndex;
}
public int getAttrCount() {
return attrCount;
}
public void setAttrCount(int attrCount) {
this.attrCount = attrCount;
}
public List<AttributeInfo> getAttributeInfos() {
return attributeInfos;
}
public void setAttributeInfos(List<AttributeInfo> attributeInfos) {
this.attributeInfos = attributeInfos;
}
public ConstantPool getCp() {
return cp;
}
public void setCp(ConstantPool cp) {
this.cp = cp;
}
}