java模拟JVM (访问标记以及继承关系的解析)

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]);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值