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++; } } }
public void StartJVM(ConsoleParam param) { //初始化指令集 Instruction.InitialInstructions(); Entry classPath = new ClassPath(param.JdkPath, param.Path); byte[] classData = classPath.ReadClass(param.ClassName); if (Switchs.DebugParse) { Console.Write(BitConverter.ToString(classData)); } Console.WriteLine(); ClassFile classFile = ClassReader.Read(classData); Interpreter interpreter = new Interpreter(); interpreter.interpret(classFile.Methods[1]); Console.Write("finished with exit code 0"); }
protected ClassFile ReadClass(byte[] classData) { ClassReader classReader = new ClassReader(); this.classData = classData; ReadMagic(); ReadVersion(); ReadConstantPoolSize(); ReadConstantPool(); ReadAccessFlag(); ReadThisClassIndex(); ReadSuperClassIndex(); ReadInterfaceCount(); ReadInterfaces(); ReadFieldsCount(); ReadFields(); ReadMethodsCount(); ReadMethods(); ReadAttributesCount(); ReadAttributes(); return(this.classFile); }
public static ClassFile Read(byte[] classData) { ClassReader classReader = new ClassReader(); return(classReader.ReadClass(classData)); }
public abstract void ReadConstantPoolInfo(ClassReader classReader);