package com.coderising.jvm.method; import java.util.ArrayList; import java.util.List; import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; public class Method { private int accessFlag;// u2 access_flags private int nameIndex;// u2 name_index private int descriptorIndex;// u2 descriptor_index private int attrCount;// u2 attributes_count /* * attributes[attributes_count]; */ private List<AttributeInfo> attributeInfos = new ArrayList<AttributeInfo>(); public Method() {} public Method(int accessFlag, int nameIndex, int descriptorIndex, int attrCount) { super(); this.accessFlag = accessFlag; this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; this.attrCount = attrCount; } private ClassFile clzFile; /** * 读取方法 method_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 Method */ public static Method parse(ConstantPool cp, ByteCodeIterator itr) { int accessFlag = itr.nextU2toInt(); int nameIndex = itr.nextU2toInt(); int descriptorIndex = itr.nextU2toInt(); int attrCount = itr.nextU2toInt(); Method method = new Method(accessFlag, nameIndex, descriptorIndex, attrCount); for (int i = 0; i < attrCount; i++) { method.addAttributeInfo(AttributeInfo.parse(cp, itr)); } return method; } /** * 专门用来获取code属性的方法 * * @return */ public CodeAttr getCodeAttr() { for (int i = 0; i < attributeInfos.size(); i++) { AttributeInfo attributeInfo = attributeInfos.get(i); if(AttributeInfo.CODE.equals(attributeInfo.getType())){ return (CodeAttr)attributeInfo; } } return null; } public void addAttributeInfo(AttributeInfo a) { this.attributeInfos.add(a); } /* * 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 List<AttributeInfo> getAttributeInfos() { return attributeInfos; } public void setAttributeInfos(List<AttributeInfo> attributeInfos) { this.attributeInfos = attributeInfos; } public ClassFile getClzFile() { return clzFile; } public int getAttrCount() { return attrCount; } public void setAttrCount(int attrCount) { this.attrCount = attrCount; } }