命令查看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 ...
随机推荐
- js实现继承
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
- java 代理的三种实现方式
Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...
- [整]C#获取天气预报信息(baidu api)包括pm2.5
/// <summary> /// 获取天气预报信息 /// </summary> /// <returns></returns> public Bai ...
- SEO命令之”site“运用详解
一.“site”基本介绍: 都知道要想查询一个特定网站的收录状况一般会分为两种情况:一.结果中有返回数据,则表明该网站已被收录:二.如果返回数据为空,则该网站未被收录.如果是以前已被收录的,现在来查没 ...
- iOS 通讯录操作
转载至:http://superuna.blog.51cto.com/4192682/982938 //新增联系人 -(void)AddPeople { //取得本地通信录名柄 ...
- 获取LocationProvider
Android的定位信息由LocationProvider对象来提供,该对象代表一个抽象的定位组件.在开始编程之前,需要先获得LocationProvider对象. 一.获取所有可用的Location ...
- ES6 基础版迭代器
ES6中引入了generator function* get() { var result1 = yield c; var result2 = yield b; var result3 = yield ...
- MySQL表类型和存储引擎版本不一致解决方法
使用的是老版本的mysql客户端Navicate 8 ,mysql 服务端用的是mysql5.6的版本,在修改版本引擎的时候出现版本不对; mysql error ‘TYPE=MyISAM’ 解决办法 ...
- 进监狱全攻略之 Mifare1 Card 破解
补充新闻:程序员黑餐馆系统 给自己饭卡里充钱 ,技术是双刃剑,小心,小心! 前言 从M1卡的验证漏洞被发现到现今,破解设备层出不穷,所以快速傻瓜式一键破解不是本文的重点,年轻司机将从本文中获得如下技能 ...
- 【LeetCode OJ】Flatten Binary Tree to Linked List
Problem Link: http://oj.leetcode.com/problems/flatten-binary-tree-to-linked-list/ The problem is ask ...