关于javap命令输出信息的详解 请问谁有关于javap命令输出信息的详解!!比如 javap -c className或者 javap -verbose className的输出内容,如何去分析??里面有iload之类的指令在哪里能够找到相关的资料说明?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Maybe in JVM documents... I dont know, just guess... http://download.csdn.net/down/150259/chenxh ———这个网址是java虚拟机规范中文版的下载地址。另外: http://tech.ccidnet.com/art/5353/20070829/1194835_1.html去这个里面看看,有个范例,去看看能不能帮到你。范例: public class ByteCodeDemo { public static void main(String[] args) { System.out.println("Hello world"); } } 在编译这个类后,你可以用十六进制编辑器打开.class文件然后参照虚拟机规范翻译字节码。幸运的是有更简单的方法。JDK包含一个命令行的反汇编器:javap,它可以转换字节码为一种可读的助记符形式,可以像下面这样通过传递'-c'参数给javap得到字节码列表: javap -c ByteCodeDemo 你应该会看到输出类似这样: public class ByteCodeDemo extends java.lang.Object { public ByteCodeDemo(); public static void main(java.lang.String[]); } Method ByteCodeDemo() 0 aload_0 1 invokespecial #1 <Method java.lang.Object()> 4 return Method void main(java.lang.String[]) 0 getstatic #2 <Field java.io.PrintStream out> 3 ldc #3 <String "Hello world"> 5 invokevirtual #4 <Method void println(java.lang.String)> 8 return 仅仅从这个短小的列表你可以学到很多字节码的知识。从main方法的第一个指令开始: 0 getstatic #2 开始的整数是方法中的指令的偏移值,因此第一个指令以0开始。紧随偏移量是指令的助记符(mnemonic)。在这个范例中,'getstatic' 指令将一个静态成员压入一个称为操作数堆栈的数据结构,后续的指令可以引用这个数据结构中的成员。getstatic 指令后是要压入的成员。在这个例子中,要压入的成员是"#2 " 。如果你直接检查字节码,你会看到成员信息没有直接嵌入指令而是像所有由java类使用的常量那样存储在一个共享池中。将成员信息存储在一个常量池中可以减小字节码指令的大小,因为指令只需要存储常量池中的一个索引而不是整个常量。在这个例子中,成员信息位于常量池中的#2处。常量池中的项目的顺序是和编译器相关的,因此在你的环境中看到的可能不是'#2' 。 分析完第一个指令后很容易猜到其它指令的意思。'ldc' (load constant) 指令将常量"Hello, World."压入操作数栈。'invokevirtual'指令调用println方法,它从操作数栈弹出它的两个参数。不要忘记一个像println这样的实例方法有两个参数:上面的字符串,加上隐含的'this'引用。 我希望能找到关于iload,istore之类的反汇编出来的信息的指令集说明之类的东西!! 《Java 虚拟机规范》看看第 6 章 JVM指定集下面是这本书第二版的在线版链接http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html比这个更好的讲解可以看看《深入 Java 虚拟机》,这本书有中文版的,现在好像不大好买,可以到图书馆去看看。 I think you find the book you need to read. haha 谢谢各位了。。TO LZ:你想得太对了 受保护的变量与友好变量的区别是什么??????、 请教JAVA中关于格式化日期的问题 一个线程a在 启动一组线程后先执行一段代码wait后,这组线程再执行 火大了,高手哪去了,还不进来? Help me.... 初学者java网络编程的一个问题 怎样让double型的变量显示时只输出2位小数??? URL对象如何通过proxy实现连接 关于JAVA toString 方法的重写 谁能提供一些较好的JAVA资料或下载资料的网站 java如何操作list的相同日期问题 java 模拟led屏显示 String 的构造方法String(String original)
另外: http://tech.ccidnet.com/art/5353/20070829/1194835_1.html
去这个里面看看,有个范例,去看看能不能帮到你。范例:
public class ByteCodeDemo {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
在编译这个类后,你可以用十六进制编辑器打开.class文件然后参照虚拟机规范翻译字节码。幸运的是有更简单的方法。JDK包含一个命令行的反汇编器:javap,它可以转换字节码为一种可读的助记符形式,可以像下面这样通过传递'-c'参数给javap得到字节码列表: javap -c ByteCodeDemo
你应该会看到输出类似这样:
public class ByteCodeDemo extends java.lang.Object {
public ByteCodeDemo();
public static void main(java.lang.String[]);
}
Method ByteCodeDemo()
0 aload_0
1 invokespecial #1 <Method java.lang.Object()>
4 return
Method void main(java.lang.String[])
0 getstatic #2 <Field java.io.PrintStream out>
3 ldc #3 <String "Hello world">
5 invokevirtual #4 <Method void println(java.lang.String)>
8 return
仅仅从这个短小的列表你可以学到很多字节码的知识。从main方法的第一个指令开始: 0 getstatic #2 开始的整数是方法中的指令的偏移值,因此第一个指令以0开始。紧随偏移量是指令的助记符(mnemonic)。在这个范例中,'getstatic' 指令将一个静态成员压入一个称为操作数堆栈的数据结构,后续的指令可以引用这个数据结构中的成员。getstatic 指令后是要压入的成员。在这个例子中,要压入的成员是"#2 " 。如果你直接检查字节码,你会看到成员信息没有直接嵌入指令而是像所有由java类使用的常量那样存储在一个共享池中。将成员信息存储在一个常量池中可以减小字节码指令的大小,因为指令只需要存储常量池中的一个索引而不是整个常量。在这个例子中,成员信息位于常量池中的#2处。常量池中的项目的顺序是和编译器相关的,因此在你的环境中看到的可能不是'#2' 。 分析完第一个指令后很容易猜到其它指令的意思。'ldc' (load constant) 指令将常量"Hello, World."压入操作数栈。'invokevirtual'指令调用println方法,它从操作数栈弹出它的两个参数。不要忘记一个像println这样的实例方法有两个参数:上面的字符串,加上隐含的'this'引用。
http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html比这个更好的讲解可以看看《深入 Java 虚拟机》,这本书有中文版的,
现在好像不大好买,可以到图书馆去看看。