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 +
'}';
}
}
}