package org.tinylcy; import org.tinylcy.accessflags.AccessFlags; import org.tinylcy.accessflags.MethodAccessFlags; 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.Arrays; /** * Created by chenyangli. */ public class MethodInfo { private ConstantPool constantPool; private short accessFlags; private short nameIndex; private short descriptorIndex; private short attributesCount; private BasicAttributeInfo[] attributes; public MethodInfo(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 attributesCountIndexU2 = U2.read(inputStream); accessFlags = accessFlagsU2.getValue(); nameIndex = nameIndexU2.getValue(); descriptorIndex = descriptorIndexU2.getValue(); attributesCount = attributesCountIndexU2.getValue(); attributes = new BasicAttributeInfo[attributesCount]; for (int i = 0; i < attributesCount; i++) { U2 attributeNameIndexU2 = U2.read(inputStream); short attributeNameIndex = attributeNameIndexU2.getValue(); BasicAttributeInfo basicAttributeInfo = BasicAttributeInfo.newAttributeInfo(constantPool, attributeNameIndex); basicAttributeInfo.read(inputStream); attributes[i] = basicAttributeInfo; } } @Override public String toString() { return "MethodInfo{" + "accessFlags=" + accessFlags + ": " + AccessFlags.getFormattedAccessFlags(new MethodAccessFlags(), 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) + '}'; } }