摘要:文件解析器解析器的名字随便起的关于对编译后的文件进行解析,目前已经完成了一大半,可能会写文章介绍一下划重点,可能。
Class文件解析器 Ming
解析器的名字[Ming](随便起的)
关于对Java编译后的Class文件进行解析,目前已经完成了一大半,可能会写文章介绍一下(划重点,可能)。
项目地址github: Ming
已知可能存在的问题class文件使用的是MUTF-8的编码格式,与UTF-8有微妙的不同,在某些情况下可能错在无法解析的情况。
有一些类型虽然声明了,但是还没有具体的添加内容,(才不是因为懒呢),如果碰到没有实装的类型,会报错,我会尽量今早将所有的类型进行实装。
遇到没有实装类型的错误类型有两种
没有找到指定的属性类型:"can"t find specific attribute"
没有找到指定的常量类型:"can"t find specific type tag: [该常量类型所对应的具体的数值]"
使用方法 环境支持JDK8及其以上版本
测试用例(因为还没有完全完成这个解析器,所以如果想要运行请尽量使用该示例)Simple.java
public class Simple implements Parent, Child{ private int data; private static final String flag= "HelloWorld"; private static final long num = 1L; private static final double dou = 0.1; public int add(int a, int b) { return a + b; } }
Parent.java
public interface Parent { }
Child.java
public interface Child { }运行
参考文件
java com.ming.print.PrintClassInfo.java 具体信息的输出
java com.ming.test.Test.java 调用PrintClassInfo#printAll() 打印所有信息
运行结果示例[magic]: cafebabe [minor_version]: 0 [major_version]: 52 [constant_pool_count]: 34 [constant_pool]: [1]: ConstantMethodrefInfo [tag]: 10 [class_index]: 3-java/lang/Object [name_and_type_index]: 28--()V [2]: ConstantClassInfo [tag]: 7 [name_index]: 29-Simple [3]: ConstantClassInfo [tag]: 7 [name_index]: 30-java/lang/Object [4]: ConstantClassInfo [tag]: 7 [name_index]: 31-Parent [5]: ConstantClassInfo [tag]: 7 [name_index]: 32-Child [6]: ConstantUtf8Info [tag]: 1 [length]: 4 [bytes]: data [7]: ConstantUtf8Info [tag]: 1 [length]: 1 [bytes]: I [8]: ConstantUtf8Info [tag]: 1 [length]: 4 [bytes]: flag [9]: ConstantUtf8Info [tag]: 1 [length]: 18 [bytes]: Ljava/lang/String; [10]: ConstantUtf8Info [tag]: 1 [length]: 13 [bytes]: ConstantValue [11]: ConstantStringInfo [tag]: 8 [string_index]: 33-HelloWorld [12]: ConstantUtf8Info [tag]: 1 [length]: 3 [bytes]: num [13]: ConstantUtf8Info [tag]: 1 [length]: 1 [bytes]: J [14]: ConstantLongInfo [tag]: 5 [value]: 01 [16]: ConstantUtf8Info [tag]: 1 [length]: 3 [bytes]: dou [17]: ConstantUtf8Info [tag]: 1 [length]: 1 [bytes]: D [18]: ConstantDoubleInfo [tag]: 6 [value]: 3fb999999999999a [20]: ConstantUtf8Info [tag]: 1 [length]: 6 [bytes]: [21]: ConstantUtf8Info [tag]: 1 [length]: 3 [bytes]: ()V [22]: ConstantUtf8Info [tag]: 1 [length]: 4 [bytes]: Code [23]: ConstantUtf8Info [tag]: 1 [length]: 15 [bytes]: LineNumberTable [24]: ConstantUtf8Info [tag]: 1 [length]: 3 [bytes]: add [25]: ConstantUtf8Info [tag]: 1 [length]: 5 [bytes]: (II)I [26]: ConstantUtf8Info [tag]: 1 [length]: 10 [bytes]: SourceFile [27]: ConstantUtf8Info [tag]: 1 [length]: 11 [bytes]: Simple.java [28]: ConstantNameAndTypeInfo [tag]: 12 [name_index]: 20- [descriptor_index]: 21-()V [29]: ConstantUtf8Info [tag]: 1 [length]: 6 [bytes]: Simple [30]: ConstantUtf8Info [tag]: 1 [length]: 16 [bytes]: java/lang/Object [31]: ConstantUtf8Info [tag]: 1 [length]: 6 [bytes]: Parent [32]: ConstantUtf8Info [tag]: 1 [length]: 5 [bytes]: Child [33]: ConstantUtf8Info [tag]: 1 [length]: 10 [bytes]: HelloWorld [access_flags]: 33 [this_class]: 2 [super_class]: 3 [interfaces_count]: 2 [interfaces]: [0]: 4-Parent [1]: 5-Child [fields_count]: 4 [fields]: [field 1 ]: [access_flags]: 2 [name_index]: 6 [descriptor_index]: 7 [attributes_count]: 0 [field 2 ]: [access_flags]: 26 [name_index]: 8 [descriptor_index]: 9 [attributes_count]: 1 [1]: AttributeConstantValueInfo [attribute_name_index]: 10 [attribute_length]: 2 [constantvalue_index]: 11 [field 3 ]: [access_flags]: 26 [name_index]: 12 [descriptor_index]: 13 [attributes_count]: 1 [1]: AttributeConstantValueInfo [attribute_name_index]: 10 [attribute_length]: 2 [constantvalue_index]: 14 [field 4 ]: [access_flags]: 26 [name_index]: 16 [descriptor_index]: 17 [attributes_count]: 1 [1]: AttributeConstantValueInfo [attribute_name_index]: 10 [attribute_length]: 2 [constantvalue_index]: 18 [methods_count]: 2 [methods]: [method 1 ]: [access_flags]: 1 [name_index]: 20 [descriptor_index]: 21 [attributes_count]: 1 [1]: AttributeCodeInfo [attribute_name_index]: 22 [attribute_length]: 29 [max_stack]: 1 [max_locals]: 1 [code_length]: 5 42-aload_0 183-invokespecial 0-nop 1-aconst_null 177-return_ [exception_table_length]: 0 [attributes_count]: 1 [method 2 ]: [access_flags]: 1 [name_index]: 24 [descriptor_index]: 25 [attributes_count]: 1 [1]: AttributeCodeInfo [attribute_name_index]: 22 [attribute_length]: 28 [max_stack]: 2 [max_locals]: 3 [code_length]: 4 27-iload_1 28-iload_2 96-iadd 172-ireturn [exception_table_length]: 0 [attributes_count]: 1 [attributes_count]: 1 [attributes]: [0]: AttributeSourceFileInfo [attribute_name_index]: 26 [attribute_length]: 2 [sourcefile_index]: 27
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/69535.html
摘要:最终形成可以被虚拟机最直接使用的类型的过程就是虚拟机的类加载机制。即重写一个类加载器的方法验证验证是连接阶段的第一步,这一阶段的目的是为了确保文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》读书笔记与常见相关面试题总结 本节常见面试题(推荐带着问题阅读,问题答案在文中都有提到): 简单说说类加载过...
摘要:需要说明的是在设计模式一书中将工厂模式分为两类工厂方法模式与抽象工厂模式,将简单工厂模式看为工厂方法模式的一种特例,两者归为一类。工厂模式的作用工厂模式的作用封装变化创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。1、什么是工厂模式Define an interface for creating an object,but let subclasses decide whi...
摘要:在属性中,和分别用于存储字节码长度和字节码指令,每条指令即一个字节类型。在虚拟机执行时,通过读取中的一个个字节码,并将字节码翻译成相应的指令。另外,虽然是一个类型的值,但是实际上一个方法不允许超过条字节码指令。 最近在写一个私人项目,名字叫做SmallVM,SmallVM的目的在于通过实现一个轻量级的Java虚拟机,加深对Java虚拟机的认知和理解。在Java虚拟机加载类的过程中,需要...
阅读 788·2021-11-12 10:36
阅读 3366·2021-09-08 10:44
阅读 2740·2019-08-30 11:08
阅读 1397·2019-08-29 16:12
阅读 2670·2019-08-29 12:24
阅读 891·2019-08-26 10:14
阅读 679·2019-08-23 18:32
阅读 1165·2019-08-23 17:52