- Java虛擬機字節碼:從入門到實戰
- 吳就業
- 509字
- 2021-01-08 19:08:27
解析實現的接口
解析完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。
推薦閱讀
- ASP.NET Core Essentials
- Mastering Python Scripting for System Administrators
- 新手學Visual C# 2008程序設計
- Python機器學習經典實例
- Building Minecraft Server Modifications
- Microsoft System Center Orchestrator 2012 R2 Essentials
- Python算法詳解
- Java程序設計與項目案例教程
- Troubleshooting Citrix XenApp?
- Distributed Computing in Java 9
- OpenCV 3計算機視覺:Python語言實現(原書第2版)
- SQL Server 2012 數據庫應用教程(第3版)
- C/C++代碼調試的藝術
- Web前端開發技術實踐指導教程
- Python 3.8編程快速入門