我正在阅读java字节码,看到了这个:
getfield #5 (Field java.lang.String name)
Run Code Online (Sandbox Code Playgroud)
什么#5意思?
我怎样才能用字节码编写程序?
Java类文件和字节码
Java类文件(字节码文件)由不同的组件组成:
http://en.wikipedia.org/wiki/Java_class_file
数字#5仅指恒定池中的位置.在该位置找到CONSTANT_FieldRef,其中包含对CONSTANT_NameAndType以及其他属性的引用.CONSTANT_NameAndType包含对CONSTANT_Utf8的引用(包含实际的字符串/名称.)
所以流程看起来像这样:
getfield #number -> FieldRef -> NameAndType -> Utf8 -> string
Run Code Online (Sandbox Code Playgroud)
http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html
因此,不是在每条getfield指令中保存整个字符串,而是保存一个数字.这提高了类文件中解释器(或JIT)和空间的性能.
手写字节码
可以使用此工具将手写字节码组装到类文件中(它包含大量示例):
http://jasmin.sourceforge.net/