目录
- 专栏导读
- 一、添加局部变量
- 二、反编译class文件
- 三、解决乱码问题
- 四、产品经理就业实战
- 1、内容简介
- 2、作者简介
专栏导读
本专栏收录于《49天精通Java从入门到就业》,本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0开始,不断进阶深入,后续还有《手把手springboot+vue实战项目》,轻松应对面试,专栏订阅地址:https://blog.csdn.net/guorui_java/category_11461823.html。
上一节介绍了49天精通Java,第39天,Java 字节码,javap命令,解读字节码清单,这一节,继续完善javap反编译问题。
一、添加局部变量
package com.guor.bean;
public class User {
private int id;
private String name;
public static String getUserInfo(int id){
String name = "张三";
System.out.println("哪吒编程 study java");
return name;
}
}
使用 javap 工具来执行反编译, 获取字节码清单:
Compiled from "User.java"
public class com.guor.bean.User {
public com.guor.bean.User();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static java.lang.String getUserInfo(int);
Code:
0: new #2 // class com/guor/bean/User
3: dup
4: invokespecial #3 // Method "<init>":()V
7: astore_1
8: iconst_1
9: istore_2
10: ldc #4 // String 哪吒编程
编程
12: astore_3
13: getstatic #5 // Field java/lang/System.out:Ljava/io/Pr
intStream;
16: new #6 // class java/lang/StringBuilder
19: dup
20: invokespecial #7 // Method java/lang/StringBuilder."<init>
":()V
23: aload_3
24: invokevirtual #8 // Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: ldc #9 // String study java
29: invokevirtual #8 // Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
32: invokevirtual #10 // Method java/lang/StringBuilder.toStrin
g:()Ljava/lang/String;
35: invokevirtual #11 // Method java/io/PrintStream.println:(Lj
ava/lang/String;)V
38: aload_3
39: areturn
}
- 编号 0 的字节码 new, 创建 User 类的对象;
- 编号 3 的字节码 dup 复制栈顶引用值;
- 编号 4 的字节码 invokespecial 执行对象初始化;
- 编号 7 开始, 使用 astore_1 指令将引用地址值(addr.)存储(store)到编号为1的局部变量中: astore_1 中的 1 指代 LocalVariableTable 中ma对应的槽位编号;
- 编号8开始的指令: iconst_1 和 iconst_2 用来将常量值1和2加载到栈里面, 并分别由指令 istore_2 和 istore_3 将它们存储到在 LocalVariableTable 的槽位 2 和槽位 3 中。
请注意,store 之类的指令调用实际上从栈顶删除了一个值。 这就是为什么再次使用相同值时,必须再加载(load)一次的原因。
- dup 指令:复制栈顶的值,并将复制的值压入栈。
- dup_x1 指令:复制栈顶的值,并将复制的值插入到最上面 2 个值的下方。
- dup2_x1 指令:复制栈顶 1 个 64 位/或 2 个 32 位的值, 并将复制的值按照原始顺序,插入原始值下面一个 32 位值的下方。
二、反编译class文件
上一节提到了javac编译Java文件,生成class文件。但是.class文件是计算机识别的我们一般看不明白,因此需要反编译变成我们能读懂的源码,但是反编译后的代码并不是和源码一模一样,有些会被优化掉,是极度接近的。
将源代码转换成二进制执行代码的过程叫“编译”,那么反编译就是将二进制执行代码转换成源代码。
下面通过jd -gui进行class文件的反编译。
下载地址:https://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/JD-GUI.shtml
点击DOWNLOAD NOW 进行下载,下载之后是一个zip文件,例如jd-gui-windows-1.6.6。
直接解压即可。点击exe文件直接运行,通过左上角的file加载你想反编译的class文件即可。
三、解决乱码问题
WIN+R输入powershell并回车进入(此处不可使用cmd)
四、产品经理就业实战
1、内容简介
本书专门为想要入行从事产品经理相关工作的零基础就业人员而编写,涵盖了在产品准备阶段、产品开发阶段、产品测试阶段和产品上线后产品经理所需要具备的各项基本技能。
全书共分为9章,第1章大致认识产品经理的职能范围;第2章讲解了产品经理的工作职责;第3章讲解了需求的相关知识;第4章介绍了流程的相关知识;第5章展示了结构图;第6章详细阐述了界面原型的相关知识;第7章介绍了UML图;第8章介绍了PRD文档的相关知识;第9章介绍了软件测试的相关知识。
本书适合零基础想要入门产品经理、产品规划师、需求分析师的人员阅读,也适合用户体验、市场运营等相关部门的朋友,特别是互联网、软件行业、AI开发行业的人员阅读,还适合大专院校互联网和产品开发相关专业的老师和学生阅读。
2、作者简介
狄睿鑫,曾任河北师范大学移动物联网研究院产品经理,拥有多年一线产品经理从业经验,现任51CTO学堂特级讲师、企业培训讲师,线上学员人数达到80余万,发布的Axure RP系列课程和产品经理方法论课程被中国联通等多家大型企业选作内部培训课程。
产品经理图书作者,已出版的Axure RP系列图书在零售市场上广受欢迎,同时被高等院校和培训机构选作教材。
所参与设计的E·School数字教育平台在2015年巴塞罗那全球智慧城市博览会暨全球峰会中,荣获全球智慧城市项目大奖,这是该博览会自创建以来我国首次获得的大奖。
当当链接:http://product.dangdang.com/29564250.html
🏆本文收录于,49天精通Java从入门到就业。
全网最细Java零基础手把手入门教程,系列课程包括:基础篇、集合篇、Java8新特性、多线程、代码实战,持续更新中(每周1-2篇),适合零基础和进阶提升的同学。
🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。