命令查看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 ...
随机推荐
- HDU 1372 Knight Moves
最近在学习广搜 这道题同样是一道简单广搜题=0= 题意:(百度复制粘贴0.0) 题意:给出骑士的骑士位置和目标位置,计算骑士要走多少步 思路:首先要做这道题必须要理解国际象棋中骑士的走法,国际象棋中 ...
- NGINX location 在配置中的优先级
location表达式类型 ~ 表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ 表示普通字符匹配.使用前缀匹配.如果匹配成功,则不再匹配其他location. = 进 ...
- 【jQuery】serializeArray()与serialize()的区别
serialize()序列化表单元素为字符串,用于 Ajax 请求. serializeArray()序列化表单元素为JSON数据. 具体实例如下: 1 <!DOCTYPE html PUBLI ...
- IT公司100题-28-整数的二进制表示中1的个数
问题描述: 输入一个整数n,求n的二进制表示中,一共有多少个1.例如n=8,二进制表示为00001000,二进制表示中有1个1. 分析: 如果一个数n不为0,那么n-1的二进制表示,与n的二进 ...
- HTML5新增Canvas标签及对应属性、API详解(基础一)
知识说明: HTML5新增的canvas标签,通过创建画布,在画布上创建任何想要的形状,下面将canvas的API以及属性做一个整理,并且附上时钟的示例,便于后期复习学习!Fighting! 一.标签 ...
- Python开发入门与实战3-Django动态页面
3.Django动态页面 上一章节我们实现的helloworld视图是用来演示Django网页是创建的,它不是一个动态网页,每次运行/helloworld/,我们都将看到相同的内容,它类似一个静态HT ...
- 【php常用】常用函数啥的
1.intval() 把变量转换成整数类型 2.trim() 去除字符串两边空格or 加上参数是去除该参数 3.array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名 ...
- C# winform程序如何打包64位安装程序
故事背景: 原来在客户电脑上工作的很正常的程序,在客户将其操作系统从32位换为64位之后,出现了不能正常使用的问题. --------------------------- 解决办法: 1:将解决方案 ...
- windows在当前位置打开终端
1) 在此文件夹窗口内空白区域右键单击(需要同时按住Shift),从菜单中选择"在此处打开命令行窗口"的项:2) 在此窗口地址栏里直接输入cmd,回车即可.
- Apache2.2与php5.17 mysql配置
php5.217应该用线程安全搬,不然各种无语的Apache打不开,PHPInfo没有Mysql的信息,记得把php.ini放入系统盘Windows目录下,Win764位的libmysql.dll也放 ...