Пример #1
0
        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);
        }
Пример #2
0
 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++;
         }
     }
 }
Пример #3
0
 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));
         }
     }
 }