读取Java字节码指令:数字是什么意思?
我正在阅读java字节码,看到了这个:
getfield #5 (Field java.lang.String name)
#5
是什么意思?
我怎样才能用字节码编写程序?
Java类文件和字节码
Java类文件(字节码文件)由不同的组件组成:
http://en.wikipedia.org/wiki/Java_class_file
- 幻数:0xCAFEBABE
- 类文件格式的版本:类文件的次要版本和主要版本
- 常量池:类的常量池
- (……)
- 字段:类中的任何字段
- 方法:类中的任何方法
- 属性:类的任何属性(例如源文件的名称等)
数字#5仅指恒定池中的位置。 在该位置找到CONSTANT_FieldRef,其中包含对CONSTANT_NameAndType以及其他属性的引用。 CONSTANT_NameAndType包含对CONSTANT_Utf8的引用(包含实际的字符串/名称。)
所以流程看起来像这样:
getfield #number -> FieldRef -> NameAndType -> Utf8 -> string
http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html
因此,不是在每个getfield
指令中保存整个字符串,而是保存一个数字。 这提高了类文件中解释器(或JIT)和空间的性能。
手写字节码
可以使用此工具将手写字节码组装到类文件中(它包含大量示例):
getfield
指令(IIRC)引用类文件的常量池,以获取有关应查找哪个字段的信息。 这里的#5表示“常量池条目号5”,然后这个常量池包含“查找java.lang.String
类型的字段name
”的信息。原因是它保持了getfield
指令的大小同样,无论要查找的字段的名称或类型如何。
我不确定我是什么意思“我怎么能用字节码编写程序?” 这是一个非常开放的问题; 它类似于询问如何用任何语言编写程序,并且需要大量的学习。 您可能需要查看Jasmin Java汇编程序,它可以大大简化此过程。
希望这可以帮助!