package com.github.chaoswang.learning.java.jvm.loader; import com.github.chaoswang.learning.java.jvm.clz.AccessFlag; import com.github.chaoswang.learning.java.jvm.clz.ClassFile; import com.github.chaoswang.learning.java.jvm.clz.ClassIndex; import com.github.chaoswang.learning.java.jvm.constant.ClassInfo; import com.github.chaoswang.learning.java.jvm.constant.ConstantPool; import com.github.chaoswang.learning.java.jvm.constant.UTF8Info; public class ClassFileParser { public ClassFile parse(byte[] codes) { ByteCodeIterator codeIterator = new ByteCodeIterator(codes); ClassFile classFile = new ClassFile(); //����ħ�� codeIterator.getBytes(4); classFile.setMinorVersion(codeIterator.nextU2ToInt()); classFile.setMajorVersion(codeIterator.nextU2ToInt()); return classFile; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { //�����������أ������صij����Ƕ��٣� AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt()); return accessFlag; } private ClassIndex parseClassIndex(ByteCodeIterator iter) { return null; } private ConstantPool parseConstantPool(ByteCodeIterator iter) { ConstantPool pool = new ConstantPool(); ClassInfo classInfo = new ClassInfo(pool); //classInfo tagֵ iter.nextU1toInt(); classInfo.setUtf8Index(iter.nextU2ToInt()); pool.addConstantInfo(classInfo); UTF8Info utf8Info = new UTF8Info(pool); //UTF8Info tagֵ iter.nextU1toInt(); //UTF8Info lengthֵ int length = iter.nextU2ToInt(); utf8Info.setLength(length); utf8Info.setValue(iter.nextUxToHexString(length)); pool.addConstantInfo(utf8Info); classInfo = new ClassInfo(pool); //classInfo tagֵ iter.nextU1toInt(); classInfo.setUtf8Index(iter.nextU2ToInt()); pool.addConstantInfo(classInfo); for(int i=0;i<8;i++){ utf8Info = new UTF8Info(pool); //UTF8Info tagֵ iter.nextU1toInt(); //UTF8Info lengthֵ length = iter.nextU2ToInt(); utf8Info.setLength(length); utf8Info.setValue(iter.nextUxToHexString(length)); pool.addConstantInfo(utf8Info); } return pool; } }