java switch if语句_反编译java的switch, if else 语句

jd-gui这款jar反编译软件,大家经常用到,它反编译后的代码可以重新生成java文件。但它反编译出的代码,在遇到部分java特定语句的时候就不容易被看懂了。

我这里就jd-gui反编译后代码的复原内容讲讲我的经验,与大家分享一下:

1、switch语句:

正常的switch语句:

publicbooleanonTouchEvent(MotionEvent event) {

finalinty = (int) event.getY();

mBounceHack = false;

switch(event.getAction()) {

caseMotionEvent.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();

} elseif(mRefreshView.getBottom() 

|| mRefreshView.getTop() <= 0) {

resetHeader();

setSelection(1);

}

}

break;

caseMotionEvent.ACTION_DOWN:

mLastMotionY = y;

break;

caseMotionEvent.ACTION_MOVE:

applyHeaderPadding(event);

break;caseMotionEvent.ACTION_CANCEL:

break;

}

returnsuper.onTouchEvent(event);

}

经过JD-GUI反编译后:

publicbooleanonTouchEvent(MotionEvent paramMotionEvent) {

inti = (int) paramMotionEvent.getY();

this.mBounceHack =0;

switch(paramMotionEvent.getAction()) {

default:

case1:

case0:

case2:

}

while(true) {

returnsuper.onTouchEvent(paramMotionEvent);

if(!isVerticalScrollBarEnabled())

setVerticalScrollBarEnabled(1);

if((getFirstVisiblePosition() !=0) || (this.mRefreshState ==4))

continue;

intj =this.mRefreshView.getBottom();

intk =this.mRefreshViewHeight;

if(((j >= k) || (this.mRefreshView.getTop() >=0))

&& (this.mRefreshState ==3)) {

this.mRefreshState =4;

prepareForRefresh();

onRefresh();

continue;

}

intm =this.mRefreshView.getBottom();

intn =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中的代码,以此类推。

0818b9ca8b590ca3270a3433284dd417.png

注意:如果在这期间包含了if部分,里面的continue是不能作数的,要找最外层部分的continue。

上面的截图中可以看出,有的if部分中也会代有continue,但它是不能算做标识位的。关于if部分拆解,下面会有具体讲到。

以上部分来自http://blog.csdn.net/xyz_fly/article/details/8014455

接下来讲讲if else语句的反编译

if else 语句在反编译时,也会难于阅读

例如:

0818b9ca8b590ca3270a3433284dd417.png

反编译得到的结果是:

0818b9ca8b590ca3270a3433284dd417.png

在这里我们做一个初步的分析:

1,continue当成else 来用,while语句也当else语句来用

2,if 里面的continue被的当成else语句 ,能和下一条语句里面的if(),组成if else 语句

3,最后一个continue就单独变成了else语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值