public static ConstantPoolInfo Read(ClassReader classReader) { ushort tag = classReader.ReadU1(); ConstantPoolInfo constantPoolInfo = null; switch (tag) { case 7: constantPoolInfo = new ConstantClass(); break; case 9: constantPoolInfo = new ConstantFieldRef(); break; case 10: constantPoolInfo = new ConstantMethodRef(); break; case 11: constantPoolInfo = new ConstantInterfaceMethodRef(); break; case 8: constantPoolInfo = new ConstantString(); break; case 3: constantPoolInfo = new ConstantInteger(); break; case 4: constantPoolInfo = new ConstantFloat(); break; case 5: constantPoolInfo = new ConstantLong(); break; case 6: constantPoolInfo = new ConstantDouble(); break; case 12: constantPoolInfo = new ConstantNameAndType(); break; case 1: constantPoolInfo = new ConstantUtf8(); break; case 15: constantPoolInfo = new ConstantMethodHandle(); break; case 16: constantPoolInfo = new ConstantMethodType(); break; case 18: constantPoolInfo = new ConstantInvokeDynamic(); break; default: throw new Exception("ClassFileError:constantPoolInfo incorrect"); } constantPoolInfo.Tag = tag; constantPoolInfo.ReadConstantPoolInfo(classReader); return(constantPoolInfo); }
public ConstantPool(ClassReader classReader, ushort length) { this.constantPoolInfos = new ConstantPoolInfo[length]; this.Length = length; //i=0位置无效 for (int i = 1; i < this.Length; i++) { ConstantPoolInfo temp = ConstantPoolInfoReader.Read(classReader); constantPoolInfos[i] = temp; //long/double类型使得下一个位置无效,需跳过 if (temp.Tag == 5 || temp.Tag == 6) { i++; } } }
private static void DebugConstantName(ConstantPool constantPool) { if (!Switchs.DebugParse) { return; } Console.Out.WriteLine(); //另起一行 for (int i = 1; i < constantPool.Length; i++) { ConstantPoolInfo info = constantPool.ConstantPoolInfo[i]; if (info.Tag == 1) { string name = Encoding.UTF8.GetString(((ConstantUtf8)info).Bytes); Console.Out.WriteLine(string.Format("序号:{0},名称:{1}", i, name)); } } }