官术网_书友最值得收藏!

解析實現的接口

解析完this_class與super_class之后,就可以繼續解析獲取該class實現的接口總數以及該class實現的所有接口。接口解析器InterfacesHandler的實現如代碼清單2-39所示。

代碼清單2-39 InterfacesHandler類

public class InterfacesHandler implements BaseByteCodeHandler {

    @Override
    public int order() {
        return 5;
    }

    @Override
public void read(ByteBuffer codeBuf, ClassFile classFile) throws Exception {
  // 接口總數interfaces_count
       classFile.setInterfaces_count(new U2(codeBuf.get(), codeBuf.get()));
       int interfaces_count = classFile.getInterfaces_count().toInt();
    // 解析接口表
       U2[] interfaces = new U2[interfaces_count];
       classFile.setInterfaces(interfaces);
       for (int i = 0; i < interfaces_count; i++) {
           interfaces[i] = new U2(codeBuf.get(), codeBuf.get());
       }
   }

}

如代碼清單2-39所示,read方法完成接口表的解析。在讀取class文件字節緩存時,先順序讀取到interfaces_count,interfaces_count是類實現的接口總數。再根據interfaces_count創建接口表interfaces,接口表的數組長度等于interfaces_count。接口表中的每項都是一個常量索引,指向常量池表中CONSTANT_Class_info結構的常量。

將解析器注冊到ClassFileAnalysiser,然后編寫單元測試。由于接口表中的每項是指向常量池表中CONSTANT_Class_info結構的常量,因此,我們可以在單元測試中,根據CONSTANT_Class_info的name_index獲取到對應的CONSTANT_Utf8_info常量,拿到接口的類型名稱。單元測試如代碼清單2-40所示。

代碼清單2-40 接口解析器單元測試

public class InterfacesHandlerTest {

    @Test
    public void testInterfacesHandlerHandler() throws Exception {
        ByteBuffer codeBuf = ClassFileAnalysisMain.readFile("InterfacesHandler.class");
        ClassFile classFile = ClassFileAnalysiser.analysis(codeBuf);
        System.out.println("接口總數:" + classFile.getInterfaces_count().toInt());
        if (classFile.getInterfaces_count().toInt() == 0) {
            return;
        }
        U2[] interfaces = classFile.getInterfaces();
// 遍歷接口表
        for (U2 interfacesIndex : interfaces) {
      // 根據索引從常量池中取得一個CONSTANT_Class_info常量
            CONSTANT_Class_info interfaces_class_info =
                        (CONSTANT_Class_info) classFile.getConstant_pool()
                                              [interfacesIndex.toInt() - 1];
       // 根據CONSTANT_Class_info的name_index從常量池取得一個
//  CONSTANT_Utf8_info常量
           CONSTANT_Utf8_info interfaces_class_name_info =
                     (CONSTANT_Utf8_info) classFile.getConstant_pool()
                      [interfaces_class_info.getName_index().toInt() - 1];
            System.out.println(interfaces_class_name_info);
        }
    }

}

單元測試結果輸出如圖2.8所示。

圖2.8 接口解析器單元測試

從結果可以看出,該class文件實現的接口總數為1,實現的接口為BaseByteCodeHandler。

主站蜘蛛池模板: 印江| 海口市| 广安市| 和平区| 资源县| 英德市| 耒阳市| 格尔木市| 准格尔旗| 庆云县| 新昌县| 云南省| 和田县| 桃园县| 兴安县| 武冈市| 新巴尔虎右旗| 仙桃市| 沁阳市| 余姚市| 义乌市| 伊金霍洛旗| 偃师市| 鹿泉市| 蕲春县| 郓城县| 石楼县| 德昌县| 牙克石市| 鸡西市| 新兴县| 巢湖市| 师宗县| 苏尼特左旗| 色达县| 南昌县| 河池市| 红原县| 都安| 丹阳市| 雷州市|