package org.tinylcy.attributeinfo; import org.tinylcy.basictype.U2; import org.tinylcy.basictype.U4; import org.tinylcy.constantpool.ConstantPool; import org.tinylcy.constantpool.ConstantUtf8Info; import java.io.InputStream; import java.util.Arrays; /** * Created by chenyangli. */ public class InnerClasses extends BasicAttributeInfo { private short numberOfClasses; private InnerClassesInfo[] innerClasses; public InnerClasses(ConstantPool constantPool, short attributeNameIndex) { super(constantPool); setAttributeNameIndex(attributeNameIndex); } @Override public void read(InputStream inputStream) { U4 attributeLengthU4 = U4.read(inputStream); U2 numberOfClassesU2 = U2.read(inputStream); setAttributeLength(attributeLengthU4.getValue()); numberOfClasses = numberOfClassesU2.getValue(); innerClasses = new InnerClassesInfo[numberOfClasses]; for (int i = 0; i < numberOfClasses; i++) { InnerClassesInfo innerClassesInfo = new InnerClassesInfo(); innerClassesInfo.read(inputStream); innerClasses[i] = innerClassesInfo; } } @Override public String toString() { return "InnerClasses{" + "attributeNameIndex=" + getAttributeNameIndex() + " [attribute name = " + ((ConstantUtf8Info) (constantPool.getCpInfo()[getAttributeNameIndex() - 1])).getValue() + "]" + ", attributeLength=" + getAttributeLength() + ", numberOfClasses=" + numberOfClasses + ", innerClasses=" + Arrays.toString(innerClasses) + '}'; } private class InnerClassesInfo { public short innerClassInfoIndex; public short outerClassInfoIndex; public short innerNameIndex; public short innerClassAccessFlags; public void read(InputStream inputStream) { U2 innerClassInfoIndexU2 = U2.read(inputStream); U2 outerClassInfoIndexU2 = U2.read(inputStream); U2 innerNameIndexU2 = U2.read(inputStream); U2 innerClassAccessFlagsU2 = U2.read(inputStream); innerClassInfoIndex = innerClassInfoIndexU2.getValue(); outerClassInfoIndex = outerClassInfoIndexU2.getValue(); innerNameIndex = innerNameIndexU2.getValue(); innerClassAccessFlags = innerClassAccessFlagsU2.getValue(); } @Override public String toString() { return "InnerClassesInfo{" + "innerClassInfoIndex=" + innerClassInfoIndex + ", outerClassInfoIndex=" + outerClassInfoIndex + ", innerNameIndex=" + innerNameIndex + ", innerClassAccessFlags=" + innerClassAccessFlags + '}'; } } }