命令查看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 ...
随机推荐
- css——手机端图片正确显示
这两天遇到的问题汇总(一): 1.图片在app端显示有差异:如下 左边图片是:图片显示太大,以至于让整个页面都失真的效果:右边是调好样式之后的效果,知道增 ...
- user-select : 保护版权内容的简单方案
有的适合我们需要保护我们页面的内容,为了版权或者安全等原因,这个适合我们可以使用 user-select 这个CSS属性,简单易用. 嗯,这个属性不麻烦,而且也不是 CSS 3 / CSS 4 的新属 ...
- MySQL 句柄数占用过多的解决方法
在Windows下安装MySQL ,用了官方的配置向导生成了my.ini,本以为很安稳了,谁知十多个小时过去之后,系统响应非常慢,看资源管理器的性能卡,发现句柄数竟然达到了10万!怪不得无论使用什么程 ...
- HDU 1171 背包
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Java MVC Controller 中通过不同方式获取 @PathVariable 参数值
1.最常用,也是最直接使用方法,通过@PathVariable注解获取 @RequestMapping(value = "/test/{a}") public @ResponseB ...
- Solr安装入门、查询详解
Solr安装入门:http://www.importnew.com/12607.html 查询详解:http://www.360doc.com/content/14/0306/18/203871_35 ...
- C#日志记录函数
错误日志记录在程序运行的实际维护中定位问题具有很大作用,日志越详细,反馈处理问题越方便. 常用的一个B/S架构下的日志函数. //日志记录函数 private void WriteLog( strin ...
- WCF 断点不会命中
VS的调试模式改为Debug 工具—选项—调试—常规中的‘要求源文件和原始版本完全匹配’的勾去掉
- M2: XAML Controls(2)
在前小节中,我们在Card程序的主界面中加入了简单的XAML控件, 本小节将在其基础上进行优化,使界面看上去更加美观.本小节用到了Grid Control, Border Control,以及XAML ...
- 细说Javascript之null、undefined和NaN
首先简单介绍一下Javascript中的数据类型,Javascript中的数据类型有undefined,boolen,number,string和object等5种,前4种是原始类型,第5种是引用类型 ...