当前位置: 首页 > 面试题库 >

读取Java字节码指令:该数字是什么意思?

孙熠彤
2023-03-14
问题内容

我正在阅读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)的性能以及类文件中的空间。

手写字节码

可以使用此工具将手写的字节码汇编到类文件中(包含许多示例):

http://jasmin.sourceforge.net/



 类似资料:
  • 问题内容: Java字节码注入到底是什么?为什么要使用它? 问题答案: Java代码编译为字节码()。字节码注入正在运行时进行修改,以在加载和运行之前立即将代码注入其中。 想象一个场景,我想找出多少次方法 在中被调用。我可以在类加载期间使用该拦截器编写一个代理,然后使用ASM对其进行修改,以便调用方法条目。 现在,我可以运行我的程序了: 并且在运行时,不仅可以完成其正常工作,而且还可以完成我在每次

  • 据我所知,缓冲阅读器比非缓冲阅读器优化了很多,因为每次读取都将从内存中完成,不需要每次都从磁盘/网络进行I/O读/写。 所以我在这里阅读答案: 缓冲读取器和文件读取器之间的特定区别 我被第二个答案弄糊涂了,这个答案似乎有很高的票数: 当向BufferedReader对象发出“read”指令时,它会使用FileReader对象从文件中读取数据。当给出指令时,FileReader对象一次读取2(或4)

  • 本文向大家介绍Java里volatile关键字是什么意思,包括了Java里volatile关键字是什么意思的使用技巧和注意事项,需要的朋友参考一下 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机

  • bufferedinputstream(BIS)比FileInputStream(FIS)快的原因请参见“为什么使用bufferedinputstream逐字节读取文件比使用FileInputStream快?”?是吗 使用BufferedInputStream,该方法委托给重载read()方法,该方法读取8192个字节,并在FIS读取单个字节时缓冲它们,直到需要它们 据我所知,磁盘是一个“块设备”

  • 本文向大家介绍什么是Python字节串?,包括了什么是Python字节串?的使用技巧和注意事项,需要的朋友参考一下 字符串是字符序列;这些是一个抽象概念,不能直接存储在磁盘上。字节字符串是字节序列-可以存储在磁盘上的东西。它们之间的映射是一种编码-其中有很多(并且无限可能)-并且您需要知道在特定情况下哪种适用才能进行转换,因为不同的编码可能会映射相同的字节到另一个字符串。例如,相同的字节字符串可以