Exemplo n.º 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);
        }
Exemplo n.º 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++;
         }
     }
 }
Exemplo n.º 3
0
        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");
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
0
        public static ClassFile Read(byte[] classData)
        {
            ClassReader classReader = new ClassReader();

            return(classReader.ReadClass(classData));
        }
Exemplo n.º 6
0
 public abstract void ReadConstantPoolInfo(ClassReader classReader);