java代碼解讀工具 java編譯器解釋器

JAVA反編譯軟件

由于JAVA語言安全性高、代碼優(yōu)化、跨平臺等特性,從1995年5月由SUN公司發(fā)布后,迅速取代了很多傳統(tǒng)高級語言,占據(jù)了企業(yè)級網(wǎng)絡(luò)應(yīng)用開發(fā)等諸多領(lǐng)域的霸主地位。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比克山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式克山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋克山地區(qū)。費用合理售后完善,十年實體公司更值得信賴。

不過,JAVA最突出的跨平臺優(yōu)勢使得它不能被編譯成本地代碼,而要以中間代碼的形式運行在虛擬機環(huán)境中,這使得JAVA的反編譯要比別的高級語言容易實現(xiàn),并且反編譯的代碼經(jīng)過優(yōu)化后幾乎可以與源代碼相媲美。

為了更好地保護知識產(chǎn)權(quán),避免本公司的智力成果輕易被人竊取,開發(fā)者有必要對反編譯工具深入了解,以便有針對性地采取保護措施。

目前,比較流行的JAVA反編譯工具有近30種,其中有三款堪稱精品:

一、 應(yīng)用廣泛的JAD

在眾多的JAVA反編譯工具中,有幾種非常著名的工具使用了相同的核心引擎——JAD,其中主要包括:Front End Plus、mDeJava、Decafe Pro、Cavaj Java Decompiler、DJ Java Decompiler、NMI’s Java Class Viewer和國產(chǎn)的JAVA源代碼反編譯專家。

JAD本身是一個命令行工具,沒有圖形界面,上述的這些工具大多是在JAD內(nèi)核的基礎(chǔ)之上加了一個圖形界面而已。這么多種產(chǎn)品的共同選擇,足可證明JAD在JAVA反編譯領(lǐng)域中的尊貴地位。

JAD是使用Microsoft Visual C++開發(fā)的,運行速度非???,可以處理很復(fù)雜的JAVA編譯文件。眾多的參數(shù)使JAD可以靈活應(yīng)付多種加密手段,令反編譯的代碼更加優(yōu)化和易讀。由于JAD參數(shù)太多,沒必要一一解釋,其中有幾個最常用的如下(以JAD 1.5.8f版本為例):

-d

- 用于指定輸出文件的目錄

-s - 輸出文件擴展名(默認為: .jad),通常都會把輸出文件擴展名直接指定為.java,以方便修改的重新編譯。

-8 - 將Unicode字符轉(zhuǎn)換為ANSI字符串,如果輸出字符串是中文的話一定要加上這個參數(shù)才能正確顯示。

最常用的反編譯指令如下所示:

Jad –d c:\javasource –s .java -8 javatest.class

這條指令將當(dāng)前目錄下的javatest.class反編譯為javatest.java并保存在c:\javasource目錄里,其中的提示輸出為中文,而不是Unicode代碼。

二、 源碼開放的JODE

JODE是全球最大的開源項目網(wǎng)站Sourceforge.net的成員,在所有的JAVA反編譯器中,JODE的反編譯效果是最好的,尤其是對付一些常見的加密手段,例如混淆技術(shù)等,更是出類拔粹。

JODE本身也是純JAVA開發(fā)的,最近越來越多的JAVA反編譯軟件也選擇JODE來做它們的核心引擎,例如JCavaj Java Decompiler、BTJ (Back To Java)、jEdit’s JavaInsight plugin等。

JODE是一個可運行的JAR文件,在windows環(huán)境下雙擊即可運行。

需要特別說明的是,JODE不是通過常規(guī)的Open-File的方式來加載JAVA編譯后的類文件(*.class)或是類包(*.jar)的, 而是通過在Options菜單中的Set Classpath來實現(xiàn)的,單獨的類文件可以將它的上一級目錄作為Classpath輸入,然后再選擇Reload Classpath即可。

新加入的類包或是類的名字會在左側(cè)窗口出現(xiàn),雙擊類包名可以展開目錄樹結(jié)構(gòu),雙擊需要反編譯的類名則在右上角的窗口中直接顯示反編譯后的源代碼。

三、 獨樹一幟的DAVA

DAVA不是一個獨立的JAVA反編譯器,而是JAVA代碼優(yōu)化工具Soot的一部分。Soot和JODE一樣是純JAVA開發(fā)的,也是一個獨立的JAR包,但卻不能通過雙擊直接運行,而是象JAD一樣在命令行狀態(tài)運行。

Soot對環(huán)境變量的配置要求非常嚴格,通常情況下要對CLASSPATH做如下設(shè)置:

Set CLASSPATH=%CLASSPATH%;c:\sootdir\sootclasses-2.1.0.jar;.;

其中的c:\sootdir\是下載的soot類包放置的路徑,CLASSPATH末尾的.;代表了當(dāng)前目錄,如果不加上這個的話Soot經(jīng)常會報一個找不到類的錯誤。

DAVA是作為Soot的一個參數(shù)使用的,通常的用法如下:

Java soot.Main –f dava –d c:\javasource javatest

注意最后的類名不用帶.class后綴,因為它默認是處理class文件,這個操作與前述的JAD的參數(shù)效果相同。

DAVA采取了流程優(yōu)化的方式進行反編譯,與傳統(tǒng)反編譯思路不盡相同,但卻對改變流程類的加密方法有獨特的反編譯效果。

上述的三種工具各有千秋,但效果都非常不錯。經(jīng)測試,它們基本上都可以把JDK自帶的一些例程完全反編譯,然后不加任何修改可再編譯成功,并能正常運行!

如何提高java代碼質(zhì)量檢查工具

1. 寫完代碼后用代碼給是工具format一下,讓其格式符合規(guī)范,看起來自然舒服; 完美主義型的程序員請在敲代碼的時候就按照規(guī)范的格式來,這樣離開了format工具代碼一樣漂亮;

2. 消除代碼中所有的warnning,警告信息畢竟不是在開玩笑,不能置之不理,一些可以確定不存在風(fēng)險、且無法修復(fù)的warning,如在1.5及以后的JDK版本中使用不帶泛型的老版集合接口時編譯器給出的warning, 可使用@SuppressWarnings標注將其忽略;

3. 提交每一個change set之前,使用Findbug這個工具(有eclipse插件)檢查一遍代碼,把它提示的所有bug都修掉,這樣可以消除大量程序隱患;

4. 編寫充足的測試用例,如果你發(fā)現(xiàn)自己的代碼不可測,即無法方便地編寫test case,那一定是代碼結(jié)構(gòu)設(shè)計得有問題,重構(gòu)之,直到可測試為止。

總結(jié):在沒有導(dǎo)師review和指導(dǎo)的情況下,完全可以通過上面四個方法自行提高代碼質(zhì)量和OO設(shè)計水平。而代碼質(zhì)量也在一定程度上反映了程序員對待職業(yè)的態(tài)度,你當(dāng)自己是碼農(nóng),按碼農(nóng)的標準去干活,那你永遠是碼農(nóng)。你當(dāng)自己是藝術(shù)家,按藝術(shù)的標準是coding,那么終有一天你會成為代碼藝術(shù)家。

java解析lrc文件代碼

lrc可以通過如下util工具類進行轉(zhuǎn)換,如果想知道結(jié)果是否讀取的有問題,可以直接用記事本打開lrc文件的,之后和輸出結(jié)果比對一下就行。

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;

}

}

誰知道檢查JAVA代碼規(guī)范的用什么工具比較好

Checkstyle

這個可以自定義規(guī)范,如變量的命名規(guī)范,方法的命名的規(guī)范,一行代碼的字數(shù),一個方法的行數(shù),是否已經(jīng)加注釋等等

有什么好用的java代碼整理工具?

Eclipse 就很方便了! CTRL+SHIFT+F

代碼庫?這樣不如寫到磁盤文件,使用WINDOWS的搜索功能就可以搜索到

當(dāng)前標題:java代碼解讀工具 java編譯器解釋器
地址分享:http://muchs.cn/article16/dosdigg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站內(nèi)鏈微信小程序、網(wǎng)站營銷網(wǎng)站維護、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)