目的:
在eclipse里直接使用Win系统的cmd命令行以及javap -c,就不用来回橫跳了。
javap -c命令有什么用呢?反汇编class文件,得到汇编语言文件,方便我们学习JVM的指令集和指令集对应的助记符(即JVM的汇编语言)。我们当然可以在cmd命令行里执行此命令,但是没有在eclipse里操作方便呀。
目录
一:使用eclipse对javaSE项目中的class文件使用javap -c进行反汇编
二:使用eclipse对普通javaEE项目中的class文件使用javap -c进行反汇编
三:使用eclipse对普通javaEE Maven项目中的class文件使用javap -c进行反汇编
四:使用eclipse直接使用cmd命令行
五:第二种方法教你使用eclipse直接使用cmd命令行
1、配置
Name是你自定义的名字;
Location是你要使用的命令的位置;
Working Directory 是工作目录=工作空间目录 拼接 项目名称目录
Arguments 是参数。
myjavap_SE
D:\DevFolder\myJDKss\jdk1.8.0_171\bin\javap.exe${workspace_loc}\${project_name}
-c -verbose -classpath bin ${java_type_name}
解释
${workspace_loc}表示工作空间所在的路径;
${project_name}表示项目的名称;
${java_type_name}表示所选java文件的类名(全名);
-c 、 -verbose 、 -classpath 是命令javap的选项 ,可以通过javap -help查看
-c 对代码进行反汇编
-verbose 输出附加信息
-classpath 指定查找用户类文件的位置
bin是javaSE项目编译后class文件所在的目录
2、保存和使用
点击apply和Run,通常会报错:
这是因为,我们没有选中任何Java文件。
下面让我们操练起来:
3、乱码怎么办?
步骤一致,不同的就是名称和Arguments。
Arguments的值: 因为javaEE项目的class文件编译在bulid\classes目录下。和javaSE编译在bin下不同哦。
-c -verbose -classpath build\classes ${java_type_name}
步骤一致,不同的就是名称和Arguments。
Arguments的值: 因为javaEE Maven项目的class文件编译在target\classes以及target\test-classes目录下, 和普通javaEE 编译在 bulid\classes目录下、javaSE编译在bin下不同哦。
-c -verbose -classpath target\classes;target\test-classes ${java_type_name}
和上面的配置相似,其实更简单
使用:
下图工具栏中小电脑图标就是打开一个终端,右边的火柴图标就是关闭此终端。打开后你就可以输入cmd或者其他dos命令了。比如我输入mstsc命令,就会出来远程连接的窗口。
知识补充:
一:
什么叫汇编,什么叫反汇编?
汇编
- 动词,指的是把汇编语言翻译成机器语言的过程。
- 名词,指的便是汇编语言
反汇编
- 动词,指的是由已生成的机器语言(二进制语言)转化为汇编语言的过程,也可以说是汇编的逆向过程。
- 名词,指的是有机器语言经过反汇编过程生成的汇编语言。
二:
处理器架构、指令集和汇编语言,三者有何关系?
作者:young cc
链接:https://www.zhihu.com/question/23474438/answer/119887585
来源:知乎
- 处理器架构就是处理器的硬件架构,称为微架构。是一堆硬件电路,去实现指令集所规定的操作运算。
- 是的,指令集决定了处理器的架构,因为处理器架构就是用硬件电路实现指令集。但是具体用什么样的处理器架构,设计怎样的硬件电路,每个人设计的都可以不一样。
- MIPS是一种采取精简指令集(RISC)的处理器架构,既有指令集,也有相应的处理器架构。大名鼎鼎的龙芯就是MIPS的。
- 汇编语言是用人类看得懂的语言来描述指令集。否则指令集的机器码都是一堆二进制数字,人类读起来非常麻烦,但汇编是用类似人类语言的方式描述指令集,读起来方便多了。
要设计处理器,首先就需要有指令集,规定处理器相应操作,通过指令集去控制处理器实现相应功能。但处理器是一堆硬件电路,只能识别二进制数据,所以指令集是由一堆二进制数据组成。而二进制数据对人类来说读起来很麻烦。为了方便人类操作指令集,发明了汇编语言来描述指令集。汇编语言类似人类语言,读起来方便多了。
虽然汇编语言读起来方便了,但也有缺陷。首先汇编语言操作起来还是挺麻烦的。其次汇编语言对应一条条指令集,所以当指令集改变时,就得修改相应汇编语言,导致其可移植性很差,不能跨平台使用,如ARM的汇编语言与Intel X86的就不同。这时人们就想开发一种更方便操作,超越指令集的语言,于是有了C,C++等高级语言。
但处理器只能识别二进制码,那怎么能识别高级语言呢?于是人们开发了编译器,依照如下顺序,将高级语言翻译成二进制码: 高级语言→→汇编语言→→二进制机器码。
至此,人类可以很方便的利用高级语言编写程序,控制处理器完成相应功能。然后程序员这个红火的职业就此大规模诞生了。
三:
JVM学习
https://blog.csdn.net/wangtaomtk/article/details/52267634
四:
eclipse中bin或者WEB-INF或者target里不显示classes文件夹解决方法:
单击Project Explorer右上角的向下三角图标,
Customiz view --->Java output folders 前面的勾去掉 就可以显示以classes文件夹了。
五:
什么情况下类会被加载?https://blog.csdn.net/angel_he/article/details/9361865
当我们主动使用类的时候,类才会被加载。
主动使用有一下6种情况:
1.创建类的实例。
例如:new Class();
2.访问某个类或接口的静态变量,或者给静态变量赋值
3.调用类的静态方法
4.反射:Class.forName("java.lang.String");
5.初始化一个类的子类
6.Java虚拟机启动时被标明为启动类的类(包含Main方法)