命令查看java的class字节码文件、verbose、synchronize、javac、javap
查看Java字节码
1 javac –verbose查看运行类是加载了那些jar文件
HelloWorld演示:
public class Test {
public static void main(String[] args) {
Object lock = new Object();
synchronized (lock) {
System.out.println("hello world.");
}
}
}
javac –verbose HelloWorld.java
D:\shiva\omcs\Test\src\sync>javac -verbose Test.java
[解析开始时间 RegularFileObject[Test.java]]
[解析已完成, 用时 毫秒]
[源文件的搜索路径: .,C:\Java\jdk1..0_31\lib,C:\Java\jdk1..0_31\lib\tools.jar]
[类文件的搜索路径: C:\Java\jdk1..0_31\jre\lib\resources.jar,C:\Java\jdk1..0_31\jre\lib\rt.jar,C:\Java\jdk1..0_31\jre
lib\sunrsasign.jar,C:\Java\jdk1..0_31\jre\lib\jsse.jar,C:\Java\jdk1..0_31\jre\lib\jce.jar,C:\Java\jdk1..0_31\jre\lib
charsets.jar,C:\Java\jdk1..0_31\jre\lib\jfr.jar,C:\Java\jdk1..0_31\jre\classes,C:\Java\jdk1..0_31\jre\lib\ext\access
bridge-.jar,C:\Java\jdk1..0_31\jre\lib\ext\cldrdata.jar,C:\Java\jdk1..0_31\jre\lib\ext\dnsns.jar,C:\Java\jdk1..0_3
\jre\lib\ext\jaccess.jar,C:\Java\jdk1..0_31\jre\lib\ext\jfxrt.jar,C:\Java\jdk1..0_31\jre\lib\ext\localedata.jar,C:\Ja
a\jdk1..0_31\jre\lib\ext\nashorn.jar,C:\Java\jdk1..0_31\jre\lib\ext\sunec.jar,C:\Java\jdk1..0_31\jre\lib\ext\sunjce_
rovider.jar,C:\Java\jdk1..0_31\jre\lib\ext\sunmscapi.jar,C:\Java\jdk1..0_31\jre\lib\ext\sunpkcs11.jar,C:\Java\jdk1..
_31\jre\lib\ext\zipfs.jar,.,C:\Java\jdk1..0_31\lib,C:\Java\jdk1..0_31\lib\tools.jar]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
[正在检查sync.Test]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/Serializable.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Byte.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Character.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Short.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Long.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Float.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Integer.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Double.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Boolean.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Void.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/System.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/PrintStream.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/FilterOutputStream.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/OutputStream.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Comparable.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/CharSequence.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Appendable.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/Closeable.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/Flushable.class)]]
[正在加载ZipFileIndexFileObject[C:\Java\jdk1..0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Throwable.class)]]
[已写入RegularFileObject[Test.class]]
[共 毫秒] D:\shiva\omcs\Test\src\sync>
可以看到虚拟机编译时做了那些事情……
java -verbose Test

可以看到虚拟机运行一个程序时加载的jar包
更多内容查看javac –help命令
2 javap查看字节码
首先使用javap –help可以查看到各种命令,各个命令什么作用,可以自己运行试试……
这里只是测试 javap –c和javap –verbose
javap –c HelloWorld
D:\shiva\omcs\Test\bin\sync>javap -c Test
警告: 二进制文件Test包含sync.Test
Compiled from "Test.java"
public class sync.Test {
public sync.Test();
Code:
: aload_0
: invokespecial # // Method java/lang/Object."<init>":()V
: return public static void main(java.lang.String[]);
Code:
: new # // class java/lang/Object
: dup
: invokespecial # // Method java/lang/Object."<init>":()V
: astore_1
: aload_1
: dup
: astore_2
: monitorenter
: getstatic # // Field java/lang/System.out:Ljava/io/PrintStream;
: ldc # // String hello world.
: invokevirtual # // Method java/io/PrintStream.println:(Ljava/lang/String;)V
: aload_2
: monitorexit
: goto
: aload_2
: monitorexit
: athrow
: return
Exception table:
from to target type
any
any
} D:\shiva\omcs\Test\bin\sync>cd ..
可以查看字节码,从中可以得到各种变量的信息等等
但是javap –verbose可以看到更加清楚的信息。如下图
D:\shiva\omcs\Test\bin\sync>javap -verbose Test
警告: 二进制文件Test包含sync.Test
Classfile /D:/shiva/omcs/Test/bin/sync/Test.class
Last modified --; size bytes
MD5 checksum 954bd4bcfcff2732e5be9925e518e79a
Compiled from "Test.java"
public class sync.Test
minor version:
major version:
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
# = Class # // sync/Test
# = Utf8 sync/Test
# = Class # // java/lang/Object
# = Utf8 java/lang/Object
# = Utf8 <init>
# = Utf8 ()V
# = Utf8 Code
# = Methodref #.# // java/lang/Object."<init>":()V
# = NameAndType #:# // "<init>":()V
# = Utf8 LineNumberTable
# = Utf8 LocalVariableTable
# = Utf8 this
# = Utf8 Lsync/Test;
# = Utf8 main
# = Utf8 ([Ljava/lang/String;)V
# = Fieldref #.# // java/lang/System.out:Ljava/io/PrintStream;
# = Class # // java/lang/System
# = Utf8 java/lang/System
# = NameAndType #:# // out:Ljava/io/PrintStream;
# = Utf8 out
# = Utf8 Ljava/io/PrintStream;
# = String # // hello world.
# = Utf8 hello world.
# = Methodref #.# // java/io/PrintStream.println:(Ljava/lang/String;)V
# = Class # // java/io/PrintStream
# = Utf8 java/io/PrintStream
# = NameAndType #:# // println:(Ljava/lang/String;)V
# = Utf8 println
# = Utf8 (Ljava/lang/String;)V
# = Utf8 args
# = Utf8 [Ljava/lang/String;
# = Utf8 lock
# = Utf8 Ljava/lang/Object;
# = Utf8 StackMapTable
# = Class # // "[Ljava/lang/String;"
# = Class # // java/lang/Throwable
# = Utf8 java/lang/Throwable
# = Utf8 SourceFile
# = Utf8 Test.java
{
public sync.Test();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=, locals=, args_size=
: aload_0
: invokespecial # // Method java/lang/Object."<init>":()V
: return
LineNumberTable:
line :
LocalVariableTable:
Start Length Slot Name Signature
this Lsync/Test; public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=, locals=, args_size=
: new # // class java/lang/Object
: dup
: invokespecial # // Method java/lang/Object."<init>":()V
: astore_1
: aload_1
: dup
: astore_2
: monitorenter
: getstatic # // Field java/lang/System.out:Ljava/io/PrintStream;
: ldc # // String hello world.
: invokevirtual # // Method java/io/PrintStream.println:(Ljava/lang/String;)V
: aload_2
: monitorexit
: goto
: aload_2
: monitorexit
: athrow
: return
Exception table:
from to target type
any
any
LineNumberTable:
line :
line :
line :
line :
line :
LocalVariableTable:
Start Length Slot Name Signature
args [Ljava/lang/String;
lock Ljava/lang/Object;
StackMapTable: number_of_entries =
frame_type = /* full_frame */
offset_delta =
locals = [ class "[Ljava/lang/String;", class java/lang/Object, class java/lang/Object ]
stack = [ class java/lang/Throwable ]
frame_type = /* chop */
offset_delta =
}
SourceFile: "Test.java" D:\shiva\omcs\Test\bin\sync>
以上为命令查看java字节码文件过程,对了解java背后的秘密,深层次理解java有用
命令查看java的class字节码文件、verbose、synchronize、javac、javap的更多相关文章
- 命令查看java的class字节码文件
源代码: public class Math { public static void main(String[] args){ int a=1; int b=2; int c=(a+b)*10; } ...
- @使用javap反编译Java字节码文件
在Sun公司提供的JDK中,就已经内置了Java字节码文件反编译工具javap.exe(位于JDK安装目录的bin文件夹下). 我们可以在dos窗口中使用javap来反汇编指定的Java字节码文件.在 ...
- java 命令查字节码文件, 查.class文件内容
1. 需要用javac,javap命令,所以先配下环境变量 2.配置环境变量 单击“计算机-属性-高级系统设置”,单击“环境变量”.在“系统变量”栏下单击“新建”,创建新的系统环境变量. 3.写需要用 ...
- Java Eclipse编译后产生的字节码文件,用DOS命令符怎么打开
在很多初学者刚刚接触eclipse的时候,写完一个代码文件.例如 Demo.java 通过run as a java application生成之后,会产生一个Demo.class. Demo.cla ...
- 从Java进程里dump出类的字节码文件
想要查看一些被增强过的类的字节码,或者一些AOP框架的生成类,就需要dump出运行时的Java进程里的字节码. 从运行的java进程里dump出运行中的类的class文件的方法: 用agent att ...
- java字节码文件 helloworld
Java代码 \\A.java public class A{} 1 2 1 2 javac A.java \\得到 A.class javap -v A.class 下面是javap工具帮我们生成的 ...
- java字节码文件
查看字节码文件: javap -verbose HellloWorld.class
- OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)
在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件 ...
- OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构
最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...
随机推荐
- HTML5全局属性和事件
全局属性和事件能够应用到所有标签元素上,在HTML4中有许多全局属性,比如id,class等.HTML5中又新增了一些特殊功能的全局属性和事件. 属性: HTML5属性能够赋给标签元素含义和语 ...
- android 自定义view -- 实现自定义 邮箱验证的Edittext
//onFinishInflate 当View中所有的子控件均被映射成xml后触发 /** * 实现自定义 实现邮箱验证的EidtText */public class CustomEditText ...
- Hadoop数据类型介绍
我们知道hadoop是由Java 编程写的.因此我们使用Java开发环境来操作HDFS,编写mapreduce也是很自然的事情.但是这里面hadoop却对Java数据类型进行了包装,那么hadoop的 ...
- Enable SSHD on Ubuntu
https://help.ubuntu.com/community/SSH/OpenSSH/Configuring
- sqoop连接oracle与mysql&mariadb的错误
错误说明: 由于我的hadoop的集群是用cloudera manager在线自动安装的,因此他们的安装路径必须遵循cloudera的规则,这里只有查看cloudera的官方文档了,请参考:http: ...
- Swift的文档注释
官方文档地址:https://developer.apple.com/library/mac/documentation/Xcode/Reference/xcode_markup_formatting ...
- Http协议(一)
Http是一种无状态,面向连接的协议.是客户端与服务端进行超文本传输协议(HTTP)的一种通信协议.目前我们使用的是Http/1.1版本. Cookie是解决http无状态,相当于一个只有一天记忆的人 ...
- Python OpenCV —— geometric
用OpenCV画几何图形. import numpy as np import cv2 # Create a black image img = np.zeros((521,512,3), np.ui ...
- JS运动基础(三) 弹性运动
加减速运动速度不断增加或减少速度减小到负值,会向反方向运动 弹性运动在目标点左边,加速:在目标点右边,减速根据距离,计算加速度 带摩擦力的弹性运动弹性运动+摩擦力 弹性:速度 += (目标点 - 当前 ...
- thrift编译安装
关于thrift的介绍:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ Apache Thrift 是 Facebook 实现 ...