反编译java的switch, if else 语句
来源:互联网 发布:java 时间格式 cst 编辑:程序博客网 时间:2024/05/16 09:20
jd-gui这款jar反编译软件,大家经常用到,它反编译后的代码可以重新生成java文件。但它反编译出的代码,在遇到部分java特定语句的时候就不容易被看懂了。
我这里就jd-gui反编译后代码的复原内容讲讲我的经验,与大家分享一下:
1、switch语句:
正常的switch语句:
- public boolean onTouchEvent(MotionEvent event) {
- final int y = (int) event.getY();
- mBounceHack = false;
- switch (event.getAction()) {
- case MotionEvent.ACTION_UP:
- if (!isVerticalScrollBarEnabled()) {
- setVerticalScrollBarEnabled(true);
- }
- if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
- if ((mRefreshView.getBottom() >= mRefreshViewHeight || mRefreshView
- .getTop() >= 0) && mRefreshState == RELEASE_TO_REFRESH) {
- mRefreshState = REFRESHING
- prepareForRefresh();
- onRefresh();
- } else if (mRefreshView.getBottom() < mRefreshViewHeight
- || mRefreshView.getTop() <= 0) {
- resetHeader();
- setSelection(1);
- }
- }
- break;
- case MotionEvent.ACTION_DOWN:
- mLastMotionY = y;
- break;
- case MotionEvent.ACTION_MOVE:
- applyHeaderPadding(event);
- break; case MotionEvent.ACTION_CANCEL:
- break;
- }
- return super.onTouchEvent(event);
- }
- public boolean onTouchEvent(MotionEvent paramMotionEvent) {
- int i = (int) paramMotionEvent.getY();
- this.mBounceHack = 0;
- switch (paramMotionEvent.getAction()) {
- default:
- case 1:
- case 0:
- case 2:
- }
- while (true) {
- return super.onTouchEvent(paramMotionEvent);
- if (!isVerticalScrollBarEnabled())
- setVerticalScrollBarEnabled(1);
- if ((getFirstVisiblePosition() != 0) || (this.mRefreshState == 4))
- continue;
- int j = this.mRefreshView.getBottom();
- int k = this.mRefreshViewHeight;
- if (((j >= k) || (this.mRefreshView.getTop() >= 0))
- && (this.mRefreshState == 3)) {
- this.mRefreshState = 4;
- prepareForRefresh();
- onRefresh();
- continue;
- }
- int m = this.mRefreshView.getBottom();
- int n = this.mRefreshViewHeight;
- if ((m >= n) && (this.mRefreshView.getTop() > 0))
- continue;
- resetHeader();
- setSelection(1);
- continue;
- this.mLastMotionY = i;
- continue;
- applyHeaderPadding(paramMotionEvent);
- }
- }
一、可以看到,反编译后的switch部分有了很大的变化,case部分都被打乱了。但这里还是有规律可循的,也就是说case部分的排列顺序是不会变的,如上例中case部分就是按照原来的保持不变。
二、接下来看while循环部分。这里面就包含了本该分别在case中的部分代码。首选将最开始的return取去,直接放到代码的最后面。然后看从return开始到第一个continue,这个就是第一个case中的代码部分,从第一个continue到第二个continue就是第二个case中的代码,以此类推。
注意:如果在这期间包含了if部分,里面的continue是不能作数的,要找最外层部分的continue。
上面的截图中可以看出,有的if部分中也会代有continue,但它是不能算做标识位的。关于if部分拆解,下面会有具体讲到。
以上部分来自http://blog.csdn.net/xyz_fly/article/details/8014455
接下来讲讲if else语句的反编译
if else 语句在反编译时,也会难于阅读
例如:
反编译得到的结果是:
在这里我们做一个初步的分析:
1,continue当成else 来用,while语句也当else语句来用
2,if 里面的continue被的当成else语句 ,能和下一条语句里面的if(),组成if else 语句
3,最后一个continue就单独变成了else语句
- 反编译java的switch, if else 语句
- 第十节 java if else switch 条件语句,switch 穿透
- [Java] 使用多个 if 语句、else if 和 switch 的区别
- 条件语句:if...else/switch
- if else 、switch选择语句
- JAVA流程控制 IF ELSE语句与Switch Case语句的使用
- C#中的分支结构:if..else if 、if... else 和 switch ...case语句的区别
- If..else If…else 语句 与 switch 语句的不同之处.
- 选择语句switch和if else的区别以及代码
- JAVA If-else语句
- 黑马程序员--If-else和switch语句
- swift 2.0 分支语句 if...else & switch
- 判断语句switch - case 和if - else
- 条件选择语句if else switch
- if else if else 语句的拓展
- java中else if比switch效率低的原因
- Java基础--->08.判断语句(if、else if、switch、while、do while)。
- Java switch与if...else if...else效率对比
- Bazaar版本管理工具 Ubuntu
- VxWorks Booting Process
- 常引用、常对象、对象的常成员
- EAS 生成子系统树后有些单据还是没有出现在配置信息中
- EAS 分录表头合并
- 反编译java的switch, if else 语句
- Zend Studio 9.0.4 正式注册版 2012-10-12
- JTable 用法汇总
- EAS人员按照公司过滤
- 如何生成均匀分布随机整数
- EAS单据F7引用设置
- EAS单据跳转
- mips的内存管理-kseg0,kseg1虚拟和物理地址映射理解
- EAS单据分录的一些初始化设置