由于JAVA語言安全性高、代碼優(yōu)化、跨平臺(tái)等特性,從1995年5月由SUN公司發(fā)布后,迅速取代了很多傳統(tǒng)高級(jí)語言,占據(jù)了企業(yè)級(jí)網(wǎng)絡(luò)應(yīng)用開發(fā)等諸多領(lǐng)域的霸主地位。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比克山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式克山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋克山地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
不過,JAVA最突出的跨平臺(tái)優(yōu)勢(shì)使得它不能被編譯成本地代碼,而要以中間代碼的形式運(yùn)行在虛擬機(jī)環(huán)境中,這使得JAVA的反編譯要比別的高級(jí)語言容易實(shí)現(xiàn),并且反編譯的代碼經(jīng)過優(yōu)化后幾乎可以與源代碼相媲美。
為了更好地保護(hù)知識(shí)產(chǎn)權(quán),避免本公司的智力成果輕易被人竊取,開發(fā)者有必要對(duì)反編譯工具深入了解,以便有針對(duì)性地采取保護(hù)措施。
目前,比較流行的JAVA反編譯工具有近30種,其中有三款堪稱精品:
一、 應(yīng)用廣泛的JAD
在眾多的JAVA反編譯工具中,有幾種非常著名的工具使用了相同的核心引擎——JAD,其中主要包括:Front End Plus、mDeJava、Decafe Pro、Cavaj Java Decompiler、DJ Java Decompiler、NMI’s Java Class Viewer和國(guó)產(chǎn)的JAVA源代碼反編譯專家。
JAD本身是一個(gè)命令行工具,沒有圖形界面,上述的這些工具大多是在JAD內(nèi)核的基礎(chǔ)之上加了一個(gè)圖形界面而已。這么多種產(chǎn)品的共同選擇,足可證明JAD在JAVA反編譯領(lǐng)域中的尊貴地位。
JAD是使用Microsoft Visual C++開發(fā)的,運(yùn)行速度非??欤梢蕴幚砗軓?fù)雜的JAVA編譯文件。眾多的參數(shù)使JAD可以靈活應(yīng)付多種加密手段,令反編譯的代碼更加優(yōu)化和易讀。由于JAD參數(shù)太多,沒必要一一解釋,其中有幾個(gè)最常用的如下(以JAD 1.5.8f版本為例):
-d
- 用于指定輸出文件的目錄
-s - 輸出文件擴(kuò)展名(默認(rèn)為: .jad),通常都會(huì)把輸出文件擴(kuò)展名直接指定為.java,以方便修改的重新編譯。
-8 - 將Unicode字符轉(zhuǎn)換為ANSI字符串,如果輸出字符串是中文的話一定要加上這個(gè)參數(shù)才能正確顯示。
最常用的反編譯指令如下所示:
Jad –d c:\javasource –s .java -8 javatest.class
這條指令將當(dāng)前目錄下的javatest.class反編譯為javatest.java并保存在c:\javasource目錄里,其中的提示輸出為中文,而不是Unicode代碼。
二、 源碼開放的JODE
JODE是全球最大的開源項(xiàng)目網(wǎng)站Sourceforge.net的成員,在所有的JAVA反編譯器中,JODE的反編譯效果是最好的,尤其是對(duì)付一些常見的加密手段,例如混淆技術(shù)等,更是出類拔粹。
JODE本身也是純JAVA開發(fā)的,最近越來越多的JAVA反編譯軟件也選擇JODE來做它們的核心引擎,例如JCavaj Java Decompiler、BTJ (Back To Java)、jEdit’s JavaInsight plugin等。
JODE是一個(gè)可運(yùn)行的JAR文件,在windows環(huán)境下雙擊即可運(yùn)行。
需要特別說明的是,JODE不是通過常規(guī)的Open-File的方式來加載JAVA編譯后的類文件(*.class)或是類包(*.jar)的, 而是通過在Options菜單中的Set Classpath來實(shí)現(xiàn)的,單獨(dú)的類文件可以將它的上一級(jí)目錄作為Classpath輸入,然后再選擇Reload Classpath即可。
新加入的類包或是類的名字會(huì)在左側(cè)窗口出現(xiàn),雙擊類包名可以展開目錄樹結(jié)構(gòu),雙擊需要反編譯的類名則在右上角的窗口中直接顯示反編譯后的源代碼。
三、 獨(dú)樹一幟的DAVA
DAVA不是一個(gè)獨(dú)立的JAVA反編譯器,而是JAVA代碼優(yōu)化工具Soot的一部分。Soot和JODE一樣是純JAVA開發(fā)的,也是一個(gè)獨(dú)立的JAR包,但卻不能通過雙擊直接運(yùn)行,而是象JAD一樣在命令行狀態(tài)運(yùn)行。
Soot對(duì)環(huán)境變量的配置要求非常嚴(yán)格,通常情況下要對(duì)CLASSPATH做如下設(shè)置:
Set CLASSPATH=%CLASSPATH%;c:\sootdir\sootclasses-2.1.0.jar;.;
其中的c:\sootdir\是下載的soot類包放置的路徑,CLASSPATH末尾的.;代表了當(dāng)前目錄,如果不加上這個(gè)的話Soot經(jīng)常會(huì)報(bào)一個(gè)找不到類的錯(cuò)誤。
DAVA是作為Soot的一個(gè)參數(shù)使用的,通常的用法如下:
Java soot.Main –f dava –d c:\javasource javatest
注意最后的類名不用帶.class后綴,因?yàn)樗J(rèn)是處理class文件,這個(gè)操作與前述的JAD的參數(shù)效果相同。
DAVA采取了流程優(yōu)化的方式進(jìn)行反編譯,與傳統(tǒng)反編譯思路不盡相同,但卻對(duì)改變流程類的加密方法有獨(dú)特的反編譯效果。
上述的三種工具各有千秋,但效果都非常不錯(cuò)。經(jīng)測(cè)試,它們基本上都可以把JDK自帶的一些例程完全反編譯,然后不加任何修改可再編譯成功,并能正常運(yùn)行!
1. 寫完代碼后用代碼給是工具format一下,讓其格式符合規(guī)范,看起來自然舒服; 完美主義型的程序員請(qǐng)?jiān)谇么a的時(shí)候就按照規(guī)范的格式來,這樣離開了format工具代碼一樣漂亮;
2. 消除代碼中所有的warnning,警告信息畢竟不是在開玩笑,不能置之不理,一些可以確定不存在風(fēng)險(xiǎn)、且無法修復(fù)的warning,如在1.5及以后的JDK版本中使用不帶泛型的老版集合接口時(shí)編譯器給出的warning, 可使用@SuppressWarnings標(biāo)注將其忽略;
3. 提交每一個(gè)change set之前,使用Findbug這個(gè)工具(有eclipse插件)檢查一遍代碼,把它提示的所有bug都修掉,這樣可以消除大量程序隱患;
4. 編寫充足的測(cè)試用例,如果你發(fā)現(xiàn)自己的代碼不可測(cè),即無法方便地編寫test case,那一定是代碼結(jié)構(gòu)設(shè)計(jì)得有問題,重構(gòu)之,直到可測(cè)試為止。
總結(jié):在沒有導(dǎo)師review和指導(dǎo)的情況下,完全可以通過上面四個(gè)方法自行提高代碼質(zhì)量和OO設(shè)計(jì)水平。而代碼質(zhì)量也在一定程度上反映了程序員對(duì)待職業(yè)的態(tài)度,你當(dāng)自己是碼農(nóng),按碼農(nóng)的標(biāo)準(zhǔn)去干活,那你永遠(yuǎn)是碼農(nóng)。你當(dāng)自己是藝術(shù)家,按藝術(shù)的標(biāo)準(zhǔn)是coding,那么終有一天你會(huì)成為代碼藝術(shù)家。
lrc可以通過如下util工具類進(jìn)行轉(zhuǎn)換,如果想知道結(jié)果是否讀取的有問題,可以直接用記事本打開lrc文件的,之后和輸出結(jié)果比對(duì)一下就行。
package com.routon.utils;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.util.Log;
/**
* parse lrc file tool
* eg:
* utilLrc lrc = new utilLrc("/sdcard/test.lrc");
* get song name : String title = lrc.getTitle();
* get performer name : String artist = lrc.getArtist();
* get album name: String album = lrc.getAlbum();
* get lrcmaker name: String lrcMaker = lrc.getLrcMaker();
* get song list: ListStatement list = lrc.getLrcList();
*
* @author xuweilin
*
*/
public class utilLrc {
private static String TAG = "utilLrc";
public class Statement {
private double time = 0.0; //time, 0.01s
private String lyric = ""; //song word
/*
* get time
*/
public double getTime() {
return time;
}
/*
* set time
*/
public void setTime(double time) {
this.time = time;
}
/*
* set time.format:mm:ss.ms
*/
public void setTime(String time) {
String str[] = time.split(":|\\.");
this.time = Integer.parseInt(str[0])*60+Integer.parseInt(str[1])+Integer.parseInt(str[2])*0.01;
}
/*
* get lrc word
*/
public String getLyric() {
return lyric;
}
/*
* set lrc word
*/
public void setLyric(String lyric) {
this.lyric = lyric;
}
}
private BufferedReader bufferReader = null;
private String title = "";
private String artist = "";
private String album = "";
private String lrcMaker = "";
private ListStatement statements = new ArrayListStatement();
/*
*
* fileName
*/
public utilLrc(String fileName) throws IOException{
FileInputStream file = new FileInputStream(fileName);
bufferReader = new BufferedReader(new InputStreamReader(file, "utf-8"));
readData();
}
/*
* read the file
*/
private void readData() throws IOException{
statements.clear();
String strLine;
while(null != (strLine = bufferReader.readLine()))
{
if("".equals(strLine.trim()))
{
continue;
}
if(null == title || "".equals(title.trim()))
{
Pattern pattern = Pattern.compile("\\[ti:(.+?)\\]");
Matcher matcher = pattern.matcher(strLine);
if(matcher.find())
{
title=matcher.group(1);
continue;
}
}
if(null == artist || "".equals(artist.trim()))
{
Pattern pattern = Pattern.compile("\\[ar:(.+?)\\]");
Matcher matcher = pattern.matcher(strLine);
if(matcher.find())
{
artist=matcher.group(1);
continue;
}
}
if(null == album || "".equals(album.trim()))
{
Pattern pattern = Pattern.compile("\\[al:(.+?)\\]");
Matcher matcher = pattern.matcher(strLine);
if(matcher.find())
{
album=matcher.group(1);
continue;
}
}
if(null == lrcMaker || "".equals(lrcMaker.trim()))
{
Pattern pattern = Pattern.compile("\\[by:(.+?)\\]");
Matcher matcher = pattern.matcher(strLine);
if(matcher.find())
{
lrcMaker=matcher.group(1);
continue;
}
}
int timeNum=0;
String str[] = strLine.split("\\]");
for(int i=0; istr.length; ++i)
{
String str2[] = str[i].split("\\[");
str[i] = str2[str2.length-1];
if(isTime(str[i])){
++timeNum;
}
}
for(int i=0; itimeNum;++i)
{
Statement sm = new Statement();
sm.setTime(str[i]);
if(timeNumstr.length)
{
sm.setLyric(str[str.length-1]);
}
statements.add(sm);
}
}
sortLyric();
}
/*
* judge the string is or not date format.
*/
private boolean isTime(String string)
{
String str[] = string.split(":|\\.");
if(3!=str.length)
{
return false;
}
try{
for(int i=0;istr.length;++i)
{
Integer.parseInt(str[i]);
}
}
catch(NumberFormatException e)
{
Log.e(TAG, "isTime exception:"+e.getMessage());
return false;
}
return true;
}
/*
* sort the word by time.
*/
private void sortLyric()
{
for(int i=0;istatements.size()-1;++i)
{
int index=i;
double delta=Double.MAX_VALUE;
boolean moveFlag = false;
for(int j=i+1;jstatements.size();++j)
{
double sub;
if(0=(sub=statements.get(i).getTime()-statements.get(j).getTime()))
{
continue;
}
moveFlag=true;
if(subdelta)
{
delta=sub;
index=j+1;
}
}
if(moveFlag)
{
statements.add(index, statements.get(i));
statements.remove(i);
--i;
}
}
}
/**
* get title
* @return
*/
public String getTitle(){
return title;
}
/**
* get artist
* @return
*/
public String getArtist(){
return artist;
}
/**
* get album
* @return
*/
public String getAlbum(){
return album;
}
/**
* get lrc maker
* @return
*/
public String getLrcMaker(){
return lrcMaker;
}
/**
* get song list
* @return
*/
public ListStatement getLrcList(){
return statements;
}
}
Checkstyle
這個(gè)可以自定義規(guī)范,如變量的命名規(guī)范,方法的命名的規(guī)范,一行代碼的字?jǐn)?shù),一個(gè)方法的行數(shù),是否已經(jīng)加注釋等等
Eclipse 就很方便了! CTRL+SHIFT+F
代碼庫?這樣不如寫到磁盤文件,使用WINDOWS的搜索功能就可以搜索到
當(dāng)前標(biāo)題:java代碼解讀工具 java編譯器解釋器
地址分享:http://jinyejixie.com/article16/dosdigg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站內(nèi)鏈、微信小程序、網(wǎng)站營(yíng)銷、網(wǎng)站維護(hù)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)