package org.tinylcy;
import org.tinylcy.accessflags.AccessFlags;
import org.tinylcy.accessflags.FieldAccessFlags;
import org.tinylcy.attributeinfo.AttributeInfo;
import org.tinylcy.attributeinfo.BasicAttributeInfo;
import org.tinylcy.basictype.U2;
import org.tinylcy.constantpool.ConstantPool;
import org.tinylcy.constantpool.ConstantUtf8Info;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
/**
* Created by chenyangli.
*/
public class FieldInfo {
private ConstantPool constantPool;
private short accessFlags;
private short nameIndex;
private short descriptorIndex;
private short attributesCount;
private BasicAttributeInfo[] attributes;
public FieldInfo(ConstantPool constantPool) {
this.constantPool = constantPool;
}
public void read(InputStream inputStream) {
U2 accessFlagsU2 = U2.read(inputStream);
U2 nameIndexU2 = U2.read(inputStream);
U2 descriptorIndexU2 = U2.read(inputStream);
U2 attributesCountU2 = U2.read(inputStream);
this.accessFlags = accessFlagsU2.getValue();
this.nameIndex = nameIndexU2.getValue();
this.descriptorIndex = descriptorIndexU2.getValue();
this.attributesCount = attributesCountU2.getValue();
ArrayList<BasicAttributeInfo> basicAttributeInfoList = new ArrayList<BasicAttributeInfo>();
for (int i = 0; i < attributesCount; i++) {
short attributeNameIndex = U2.read(inputStream).getValue();
BasicAttributeInfo basicAttributeInfo = BasicAttributeInfo.newAttributeInfo(constantPool, attributeNameIndex);
basicAttributeInfo.read(inputStream);
}
this.attributes = basicAttributeInfoList.toArray(new AttributeInfo[0]);
}
@Override
public String toString() {
return "FieldInfo{" +
"accessFlags=" + accessFlags + ": " + AccessFlags.getFormattedAccessFlags(new FieldAccessFlags(), accessFlags) +
", nameIndex=" + nameIndex + " [name = " +
((ConstantUtf8Info) (constantPool.getCpInfo()[nameIndex - 1])).getValue() + "]" +
", descriptorIndex=" + descriptorIndex + " [descriptor = " +
((ConstantUtf8Info) (constantPool.getCpInfo()[descriptorIndex - 1])).getValue() + "]" +
", attributesCount=" + attributesCount +
", attributes=" + Arrays.toString(attributes) +
'}';
}
}