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中的代码,以此类推。
注意:如果在这期间包含了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语句