java模拟JVM (访问标记以及继承关系的解析)
接下来就是accessflag以及class信息和interfaces的解析了
这块都很简单直接贴代码
首先是对之前的classfilereader方法类添加一个新的方法用来解析ACCESSFLAG
/**
* ACC_PUBLIC = 0x0001;
* ACC_FINAL = 0x0010;
* ACC_SUPER = 0x0020;
* ACC_INTERFACE = 0x0200;
* ACC_ABSTRACT = 0x0400;
* ACC_SYNTHETIC = 0x1000;
* ACC_ANNOTATION = 0x2000;
* ACC_ENUM = 0x4000;
* @param accessFlag
*/
public static void parseClassAccessFlag(byte[] accessFlag){
int accessFlagInt = BytesToOtherUtil.bytesToInt(accessFlag);
String accessFlagString = Integer.toHexString(accessFlagInt);
char[] chars = accessFlagString.toCharArray();
System.out.println("ACCESS_FLAG:---");
parseClassAccessFlag(chars);
}
private static void parseClassAccessFlag(char[] chars){
if (chars.length==2){
if (chars[1]=='1'){
System.out.println("PUBLIC");
}
if (chars[0]=='1'){
System.out.println("FINAL");
}else if (chars[0]=='2'){
System.out.println("SUPER");
}
}else if (chars.length==3){
if (chars[2]=='1'){
System.out.println("PUBLIC");
}
if (chars[0]=='2'){
System.out.println("INTERFACE");
}else if (chars[0]=='4'){
System.out.println("ABSTRACT");
}
if (chars[1]=='1'){
System.out.println("FINAL");
}else if (chars[1]=='2'){
System.out.println("SUPER");
}
}else if (chars.length==4){
if (chars[3]=='1'){
System.out.println("PUBLIC");
}
if (chars[0]=='1'){
System.out.println("SYNTHETIC");
}else if (chars[0]=='2'){
System.out.println("ANNOTATION");
}else {
System.out.println("ENUM");
}
if (chars[1]=='2'){
System.out.println("INTERFACE");
}else if (chars[1]=='4'){
System.out.println("ABSTRACT");
}
if (chars[2]=='1'){
System.out.println("FINAL");
}else if (chars[2]=='2'){
System.out.println("SUPER");
}
}
}
后面的解析先按照逻辑写在test主类中
//access—flag的解析
byte[] accessFlag = ClassFileReader.readU2(inputStream);
ClassFileReader.parseClassAccessFlag(accessFlag);
//this_class
byte[] thisClass = ClassFileReader.readU2(inputStream);
int thisClassInt = BytesToOtherUtil.bytesToInt(thisClass);
ConstantClassInfo element = (ConstantClassInfo) (constantPoolOopDesc.getElements()[thisClassInt]);
System.out.println("thisClass = "+constantPoolOopDesc.getElements()[(int)element.index]);
//super_class
byte[] superClass = ClassFileReader.readU2(inputStream);
int superClassInt = BytesToOtherUtil.bytesToInt(superClass);
ConstantClassInfo superClassInfo = (ConstantClassInfo) (constantPoolOopDesc.getElements()[superClassInt]);
System.out.println("superClass = "+constantPoolOopDesc.getElements()[(int)superClassInfo.index]);
//interfaces解析
byte[] interfaceCount = ClassFileReader.readU2(inputStream);
int interfaceCountInt = BytesToOtherUtil.bytesToInt(interfaceCount);
System.out.println("this class interfaces count is "+interfaceCountInt);
for (int i =0;i<interfaceCountInt;i++){
byte[] interfaceByte = ClassFileReader.readU2(inputStream);
int interfaceInfoIndex = BytesToOtherUtil.bytesToInt(interfaceByte);
ConstantClassInfo interfaceInfo = (ConstantClassInfo) (constantPoolOopDesc.getElements()[interfaceInfoIndex]);
System.out.println("interface classname is = "+constantPoolOopDesc.getElements()[(int)interfaceInfo.index]);
}