javastream反編譯
1. java 學習方法或捷徑--求教
JAVA同其它任何一門編程語言一樣,都是要從淺到深的過程,如果你想愉快的學習這門語言的話,給你看篇文章,記住JAVA學習要有耐心!下面的文章也許對你有幫助
1. Java語言基礎
談到Java語言基礎學習的書籍,大家肯定會推薦Bruce Eckel的《Thinking in Java》。它是一本寫的相當深刻的技術書籍,Java語言基礎部分基本沒有其它任何一本書可以超越它。該書的作者Bruce Eckel在網路上被稱為天才的投機者,作者的《Thinking in C++》在1995年曾獲SoftwareDevelopment Jolt Award最佳書籍大獎,《Thinking in Java》被評為1999年Java World「最愛讀者歡迎圖書」,並且贏得了編輯首選圖書獎。作者從1986年至今,已經發表了超過150篇計算機技術文章,出版了6本書(其中4本是關於C++的),並且在全世界做了數百次演講。他是《Thinking in Java》、《Thinking in C++》、《C++ Inside & Out》《Using C++》和《Thinking in Patterns》的作者,同時還是《Black Belt C++》文集的編輯。他的書被讀者稱為「最好的Java參考書……絕對讓人震驚」;「購買Java參考書最明智的選擇」;「我見過的最棒的編程指南」。作者的非凡才華,極其跨越語言的能力,使作者被選為Java發展10年間與Java關系最密切的10個人物之一。
《Thinking in Java》講述了Java語言的方方面面,很多Java語言的老手都評價「這是一本將Java語言講得相當醜陋的書」。該書談及了java語言的很多細節,每一個方面都是相當深刻的。通過本書你可以看到「醜陋的」java語言。
網路上關於java語言講解的視頻很多很多,其中不凡有垃圾。《翁愷—JAVA語言》可能是你學習java語言基礎的唯一選擇,該講座基本按照《Thinking in Java》這本書講解,其中不凡有翁老師的很多有意思的笑話。我很幸運學習就是從此視頻開始的。內容包括30講,我總共看了3遍。
不過,對於初學者我不太推薦使用《Thinking in Java》,我比較推薦Prentice Hall PTR 的《Core Java 2》國內稱為《Java 2 核心技術》,目前是第七版。網路上大家都可以下載到電子版。Oreilly的《Java in a nutshell》也是一個不錯的選擇。讀完以上兩本後,你可以看看翁愷老師的視頻,接著可以研究《Thinking in Java》了。
2. Java數據結構
市面上關於Java數據結構的書本身就很少很少。大致有APress 的《Java Collections》,Jones 和Bartlett 的《Data Structures in Java》、《Object-oriented Data Structures Using Java》以及Prentice Hall 出版的《Data Structures and Algorithms in Java》 (Dec 19, 2005)還有一本就是《Data Structures And Algorithms With Object-oriented Design Patterns In Java》。很幸運我的第一本英文書就是APress 的《Java Collections》(本書在國內可能根本就沒有中文版――只能下載英文版了),很不錯,講得很有條例、很簡單,是一本完完全全Java Collections API介紹的書籍,其中不凡有擴展API的例子。這是我推薦你學習java數據結構的唯一一本好書。其它的Jones 和Bartlett的那兩本國內好像有一本中文版,想看你也可以看看。
在學習完API後,你可以看看java.util包中對應的類了。不過只有在學習過設計模式後你才有可能完全理解整個Java Collections Framework。Java Collections Framework使用了很多著名的設計模式如:迭代器(Iterator)模式,工廠方法模式、裝飾器模式、適配器模式等等。通過研究java.util包中數據結構的源代碼,你可以知道臭名昭著的Properties類的設計了,同時可能基本具備設計簡單的數據結構的能力了。
所謂學習無止境,學習完Sun提供了Java Collections Framework後,你可以研究Apche的另一個Java Collections Framework,很有意思哦。互為補充的兩個Framework。
在大家學習、研究Java Collections之前,我提示一下Java Collections主要包括以下三部分:介面(Interface)、實現(Implemention)和演算法(Algorithm)。
1. 介面主要有List、Set、Queue和 Map。List 、Se t和Queue是 Collection介面的子介面。
2. 實現主要是實現這些介面的具體類。如實現List介面的ArrayList、LinkedList、Stack和Vector;實現Set介面的HashSet、TreeSet 和LinkedHashSet;實現Queue介面的PriorityQueue、SynchronousQueue等等;實現Map介面的HashMap、TreeMap、Hashtable、Properties、WeakHashMap等等。
3. 演算法主要是由Arrays類和Collections類提供的,它是整個Java Collection Framework演算法的核心。支持各種類型的排序,查找等常用操作。
Java Collections中包含兩個版本的數據結構,主要是原先的支持同步的數據結構和後來不支持同步的數據結構。
Java Collection Framework在使用Comparator和Comparable介面支持排序。同時提供新舊兩個版本的迭代器Iterator和Enumeraton,以及它們如何轉換等等。
在java.util包中的Obserable介面和Observer類是考察者模式的核心。
……
3. Java IO
市面上關於IO的書籍也僅僅只有Oreilly出版社的兩本,都是Elliotte Rusty Harold的著作。兩本書的風格基本一致,推薦閱讀是第一版的《Jvava I/O》,講得比較淺顯,內容相對比較集中,實例也很多。第二版今年5月國外才出版,很有幸我在網路上下載了第二版,講得極其詳細――726頁的大塊頭(我化了兩個星期),這次將NIO和IO和在一起,還包括J2ME部分的,不過串口、並口通信部分好像類庫支持不夠,自己不能實際操作。
與第一版的《Jvava I/O》一起的Oreilly還有一本《Jvava NIO》,也是很不錯的哦。
大家在依次閱讀完《Jvava I/O》以及《Jvava NIO》後,可以研究java.io包中的源代碼了。在大家研究源代碼前我給點提示:
Java的io包主要包括:
1. 兩種流:位元組流(byte Stream)和字元流(character stream),這兩種流不存在所謂的誰代替誰、誰比誰高級之說,它們互為補充,只是側重點不同而已。
2. 兩種對稱:1.位元組流、字元流的對稱;2.輸入、輸出的對稱。
3. 一個橋梁:將位元組流轉變為字元流的InputStreamReader和OutputStreamWriter。
其中必須注意:
1. PipedInputStream和PipedOutputStrem是兩個比較有趣的類。
2. 支持Buffered的流是我們經常使用的類。
3. 裝飾器(Decorator)模式在java最著名的應用就是用於io的設計。仔細研究各個Filter流與具體流的關系,多看設計模式的書籍。相信你會有所所獲。
4. 學習好io包,是研究net包,rmi包……的基礎哦!
4 . Java資料庫
資料庫的書籍太多太多了,也是太爛太爛了!這方面的書我基本都研究過,推薦的你就看看Apress的《JDBC Recipes A Problem Solution Approach 》很不錯,國外2005年底才出版,(國內好像沒有中文版,不過出了中文版也不一定值得看――國內經常將國外的書翻譯得一塌糊塗、不堪入目)不過我們真的很幸運,網路上有電子版的。值得一看。推薦我看的第一本比較滿意的――Wiley出版的《Java Database Bible》,講得很不錯!Sun公司自己的關於JDBC API介紹的那一本《JDBC API Tutorial andRefernece》也不錯。我第二本JDBC的就是研究的這套API。
不過目前這些書都是一些相對比較浮淺的API應用的書籍。有機會我會給大家帶來介紹JDBC API以及JDBC實現內部細節的書!我盡快努力,同時希望得到大家的支持!
順便給學習JDBC的朋友一點提示:
JDBC的學習和使用主要是這套API,其使用過程也是極其簡單,下面是使用JDBC的一般流程:
1. 載入某個資料庫的驅動(Driver類),通常使用Class.forName(「驅動的類名「);
2. 連接資料庫――
Connection con = DriverManager.getConnection(url,username,password);
3. 得到會話――Statement stmt = con.createStatement();
4. 執行操作――Result rs = stmt.executeQuery(「sql查詢語句」);
5. 處理結果――
while(rs.next()){
String col1 = rs.getString(1);
……
}
簡單吧!整個JDBC中可以變化的一般是:
1. 可以由Connection對象創建Statement、PreparedStatement和CallableStatement創建三種類型的Statement。
2. 可以創建多種類型的ResultSet:支持單向移動和個自由移動;可更新的和不可更新的;支持不同等級的交易的…..
3. 數據輸入的批處理。
4. 結果集中特殊類型(Blob、Clob、Arrary和Ref、Struct)列的操作。
5. 這些特殊類型的錄入資料庫。
6. javax.sql包中特殊結果集(CachedRowSet、JdbcRowSet、WebRowSet)的操作。
7. 其它的就是一個DataSource了,也很簡單!一個J2EE中的被管理對象
簡單吧!相信大家很快就會征服JDBC。
5. Java 網路編程
網路編程――一個神秘的、充滿挑戰的方向。不過在談Java網路編程之前首先感謝Sun公司的開發人員,因為它們天才的設想,充滿智慧的架構,使廣大java程序員學習java網路編程變得異常簡單。
Java網路編程方面的書,我推薦O'Reilly的《Java Network Programming》,目前已經第三版了,以前的版本市面上肯定有!網路上早有第三版的電子版,國外2004年出版,706頁哦!講得很全,比較深入,太深入的可能由於Sun有些東西沒有完全公開,所以也就不好講了,有興趣的可以下載看看!第二本還是O'Reilly 1998年出版的《Java distributed computing 》,基礎部分寫得比較詳細,後面的實例還是值得研究的。
在大家閱讀這些書之前,給大家一點提示:
java網路編程其實相對比較簡單,入門也很快很快。java網路編程主要包括兩個部分:1.Socket;2.URL部分。不過第二部分也完全建立在第一部分的基礎上。
1. Socket包括客戶端的Socket和伺服器端的ServerSocket。還有就是DatagramSocket和DatagramPacket,它對應於UDP通信協議。 總之,Socket部分是建立其它高級協議的基礎。
2. URL類是一個網路資源定位器,通常和具體的網路協議如HTTP,FTP,Telnet……相關。通過該類可以連接網路上的資源,通過其openStream可以以io包中的流(InputStream)的形式讀取網路資源;通過其OpenConnection方法,可以打開一個連接,在此連接上可以不僅可以完成讀的操作,還可以完成寫的操作。
Java的網路編程大體包括以上兩部分。網路編程和IO以及多線程部分非常密切,在學習此部分前大家一定對這兩部分了解比較透徹。
學習了以上部分你可以研究java.net包中的與此相關的源代碼了!研究所有的源代碼還為時尚早。在整個net包中包含:ContentHandlerFactory、URLStreamHandlerFactory、URLStreamHandler、URLClassLoader等輔助類,它們構成了java.net網路編程的框架,通過研究其源代碼,你不僅可以快速理解java.net包,還可以為以後擴展該包打下基礎,甚至可以將此思維方式運用到自己的項目中。
到此為止你對java.net包應該才了解60%,還有一部分你可以使用JDecompiler之類的反編譯軟體打開你JDK安裝目錄下\jdkxxx\jre\lib目錄中的rt.jar,用WinRAR之類的軟體打開它的sun.net包,反編譯所有的文件,它是URL類工作的細節。當研究完該sun.net包,你就會對整個網路編程很熟悉很熟悉了。
一切看起來我們已經對網路編程很精通了。其實不然,剛剛開始而已,要想深入,請繼續吧!網路上很多優秀的網路編程庫甚至軟體可以為我們「添加功力」。如Apache的HttpCore和HTTPConnection 是兩個和HTTP協議相關庫;JGroups是研究分布式通信、群組通信的必讀庫;接著我們可以研究P2P的軟體包,如Sun公司的JXTA,它可能是java平台點對點通信未來的標准哦!接著你可以研究成熟得不得了,使用極其廣泛得P2P軟體Azureus!www.sourceforge.net可以下載到!
千里之行始於足下!Just do it !(目前我也只研究了net包,其它的會在不久的將來繼續深入。Sun公司因為某些原因沒有公開net的其它實現細節,在其允許將其源代碼以文字的形式加以研究,以及允許將其沒有公開的實現寫入書中時,我很希望能出一本java網路編程的書籍,以飧廣大讀者!!)
6. Servlet和JSP
Servlet、JSP的書也是滿地都是!值得推薦的也僅僅兩三本。實推Addison Wiley的《Servlets and JavaServer pages :The J2EE Technology Web Tier》,又是一本很厚的哦!國外2003年出版、784頁,講得比較全,例子也很多,特別是第八章Filter,舉了幾個不錯的例子。其它所有我看到的關於Servlet和JSP的書都沒有如此深入的!(可能有我沒有看到而已)。O』reilly的《Java Servlet Programming》和《Java Server Pages》相對比較好懂一些,可以讀讀!
在大家學習Servlet和Jsp之前我還是要提醒一下:
本質上說Servlet就是一個實現Servlet介面的、部署於伺服器端的伺服器端的程序罷了!它可以象寫其它任何java應用程序一樣編寫,它可以操作資料庫、可以操作本地文件、可以連接本地EJB……編寫Servlet程序的一般流程為:
1. 繼承一個HttpServlet類;
2. 覆蓋其doGet、doPost方法;
3. 在覆蓋方法的內部操作方法參數HttpServletRequest和HttpServletResponse。
4. 讀取請求利用HttpServletRequest。利用HttpServletRequest你可以操作Http協議的協議頭、可以得到請求的操作方法、可以得到請求的路徑、可以得到請求的字元串、以及和請求客戶相關的信息,更主要的你可以得到Cookie和HttpSession這兩個對象。
5. 利用Cookie你可以操作「甜心」對象或者將其寫入HttpServletResponse中。
6. 向客戶輸出信息可以使用HttpServletResponse。使用HttpServletResponse可以寫入各種類型的協議頭、可以增加Cookie、可以重定向其它URL、可以向客戶發送Http協議的狀態碼。
7. 利用HttpSession在會話內完成你想實現的任何功能。
同時Servlet還提供了一些事件和事件監聽器(簡單的觀察者模式而已)。還有就是過濾器(Filter)和包裝器(ServletRequestWrapper、ServletResponseWrapper)――簡單的流的使用和裝飾器模式的使用。
學習Sevlet、JSP必然要部署到伺服器中,記住通常文件部署的步驟和參數的設置以及在程序中如何使用就可以了。
完全理解Servlet後,學習jsp相對比較容易了!Jsp完全建立在Servlet的基礎上,它是為了迎合那些喜歡在Html文檔中嵌入腳本(如:PHP之類的網頁編程語言)的程序員的需要罷了!學起來也相當的容易!
一切看起來似乎那麼的風平浪靜,簡單好學!簡單的表象背後有其復雜的機理。要想對Servlet和Jsp徹底研究,你得研究Tomcat等開源軟體的具體實現。它無非就是一個伺服器,在客戶利用網頁通過HTTP協議向伺服器發送請求後,伺服器將此HTTP請求轉化為相應的HttpServletRequest對象,調用你編寫的Servlet罷了,在你的Servlet中你肯定操作了此HttpServletRequest了吧,同時操作了HttpServletResponse了吧,伺服器就將此HttpServletResponse按照HTTP協議的要求利用HTTP協議發送給你的瀏覽器了!在伺服器端的Jsp網頁在被客戶請求後,Tomcat會利用編譯軟體,使用javax.servlet.jsp包中的模板,編譯此jsp文件,編譯後就是一個Servlet!以後的操作和Servlet完全一樣哦!
在Servlet和Jsp的基礎上出現了,所謂的高級技術:JSTL,Struts……無非就是一些標簽和MVC模式的使用。
繼續前進吧!勝利就在前方!!
7. 多線程
一個看起來很神秘,卻很容易上手、很難精通的方向!
我推薦兩本我感覺很好的書籍。首先是我第一本能上手看的這方面的書,Sams 1998年出版的《Java Thread Programming》,寫得暴好,很容易讀懂,我有空還時常看當時的筆記!要知道怎麼好你自己看吧!第二本OReilly三次出版的《Java Threads》,最新是2004版,國內好像有中文版,推薦你還是看英文版的吧!書中談到了與多線程相關的N個方向,如IO、Swing、Collection等等。
給大家一點提示吧!java類庫中與多線程相關的類不是很多,主要有:Thread、ThreadGroup以及ThreadLocal和InheritableThreadLocal四個類和一個Runnable介面;關鍵字synchronize、volatile ;以及Object對象的wait、notify、notifyAll方法!
1 Thread是多線程的核心類,提供了一系列創建和操作多線程的方法。
2 ThreadGroup是一個管理Thread的工具類。
3 ThreadLocal和InheritableThreadLocal為Thread提供了一個類似保險箱功能的存儲線程對象的類!
4 Runnable不用說了吧!
5 synchronize是同步方法和同步塊的核心哦!多個線程調用此方法時,只有一個線程可以使用此方法,其它方法阻塞,從而保證被操作對象內部狀態完整性。某個線程調用帶有synchronize的方法或塊時會得到該對象的對象鎖,完成塊中的操作後釋放此對象鎖,從而其它對象可以繼續操作。
6 wait、notify、notifyAll提供了有效的等待/通知機制。Java語言中每一個對象都有一個休息室,任何線程在其操作的對象的狀態不滿足的情況下,在該對象的休息室中休息,釋放對象鎖;當其它線程操作該對象後,喚醒休息室中的線程,它們再檢查條件,當條件滿足後,執行相應的操作。
多線程大致就這么多基礎的!簡單嗎!這對於一個真正的程序員應該是不夠的,真正對多線程要有所掌握,請您研究java.util.concurrent包吧!大師Doug Lea的作品,原先是一個開源的一致性編程的庫,後來被Sun公司並入java類庫。作者的網站上也有另外一個版本的該類庫!值得研究的好東西!Hibernation、OpenJMS等開源軟體都使用了此包!
8. 設計模式
談到設計模式很多人多會推薦GOF的那本,該書在Amzon上是五星級的推薦書籍。不過對於學習java沒多久的、特別是java初學者,我很不推薦這本書。主要是該書的例子基本都是C++的,很多細節沒有講述得足夠清楚。
我給大家推薦的第一本是閻宏博士的《Java 與模式》,它是第一本中國人自己寫的關於設計模式的書籍,寫的比較有趣,融合了很多中華民族的文化和觀念,例子、類圖都比較多,且相對簡單!非常不錯的入門書籍――又是大塊頭哦!
其次我推薦Wiley出版社出版的《Pattern In Java》一套三本,我才看了第一本,好像第二本不怎麼樣,第三本還不錯!
第三本是中文翻譯版的關於多線程模式的(很難得的中文翻譯版)中國鐵道出版社2003年出版的《Java多線程設計模式》,將多線程模式講得非常淺顯,配有大量的圖例,每章都有習題,最後有答案!我研究多線程模式就是由它開始的!
第四本,今年出版的Head First系列的《Head First Design Pattern》,秉承Head First系列圖書的優點,大量的類圖、豐富的實例、有趣的註解,值得購買!
其次在J2EE方向你可以研究閱讀Addison Wesley 2002年出版的《Patterns of Enterprise Application Architecture》,眾多大腕的作品,講企業消息集成的!Sun提供的《J2EE PATTERNS SL500》也很好!晚了推薦那一本Amzon 4星半的《Holub on patterns》,大師的作品,提供了,很值得研究的例子,不過對上面四本不是很熟悉的讀者,最好不要讀它!可能會讓你比較累!
我學習設計模式經過一段很曲折的路線,前前後後大約看了20本,閻宏博士的《Java 與模式》我看了4遍,還排除我第一次基本沒看懂的看!記得研一時老師給我們講了GOF的那本,作為選修課,我和它們計算機系的碩士、博士們一起,到最後一個班40-50個人,不超過3個人明白,我也沒有明白任何一點(基礎差吧――主要我對C++語言一點都不了解),憑我不伏輸的性格,我認為我對java語言理解還可以,我就借了《Java 與模式》,結果還是基本沒看懂。很有幸的是讀研三時,聽過了上交大饒若楠老師關於Java OOP語言的講座,我懂了組合書籍模式等三種設計模式後,對其它模式有了強烈的興趣和要征服它的願望!工作後我買的第一本就是《Java 與模式》,第一遍花了2個月研究了這個1000多頁的大塊頭,後來第三遍15天左右就可以搞定,筆記記了一大本!從此一發不可收拾。
選對書、埋頭研究。相信很快就會入門的!
學習Java語言8個簡單的部分,這只是我們研究Java語言的開始!這些都懂了充其量一個java程序員而已,後面的路很長很長!我們可以繼續研究資料庫實現的源代碼、Servlet伺服器的源代碼、RMI、EJB、JNDI、面向方面編程、重構、ANT工具、Eclipse工具、Spring工具、JBoss、JOnAS、Apache Geronimo等J2EE伺服器!研究了這些你可能會成為一個出色的J2EE Architecture!你可以繼續研究剖析器、編譯器、JNODE(java寫的操作系統)……
感謝大家有此耐心,聽我羅羅嗦嗦大半天!感謝大家的閱讀,感謝群里的朋友!這篇文章主要應群里朋友的呼聲――不知道如何選書、不知道從何看起!大半天的功夫完成趕此文章,字句上難免有失誤,同時由於能力有限不凡有錯誤!請閱讀後批評指正!
上面基本是我研究java語言的順序,以上書籍都是我閱讀過的,不存在替任何出版社宣傳的成分!有的方法可能不適合你,假如你能收獲一點,兩點甚至更多,請你不要吝嗇推薦給你的朋友――共同學習!
感謝大家的閱讀;感謝互聯網的設計者;感謝java的設計師;感謝www.open-open.com和www.sourceforge.net網站!
2. .exe文件怎麼反編譯為java代碼(有木有造的)
如果你的exe是用EXE4J生成的可以使用位運算提取class文件
File f=new File("...");//exe文件路徑
File f1=new File("...");//生成的rar文件路徑
FileInputStream fin=new FileInputStream(f);
FileOutputStream fout=new FileOutputStream(f1);
BufferedInputStream bin = new BufferedInputStream(fin);
BufferedOutputStream bout = new BufferedOutputStream(fout);
int in = 0;
do {
in = bin.read();
if (in == -1)
break;
in ^= 0x88;
bout.write(in);
} while (true);
bin.close();
fin.close();
bout.close();
fout.close();
運行完會生成rar,解壓縮後得到項目目錄,但文件是.class的,然後使用jd-gui反編譯一下就是源代碼了
3. Mule ESB使用了中文,則返回亂碼,怎麼解決
解決這個問題有兩種方案:
1. 改變jvm的默認字元編碼。
2. 修改CxfInboundMessageProcessor類的源代碼。
第一種方案通過修改伺服器的啟動參數,追加一段「-Dfile.encoding=UTF-8」,就可以改變伺服器的java運行環境。
此時啟動伺服器時會發現,雖然WSDL中文不再出現亂碼了,但是伺服器控制台顯示的中文 卻全都成了亂碼 。wsdl 是否出現亂碼依賴於運行伺服器的默認字元集,對於OECP平台來說是不可控的。OECP平台使用什麼樣的字元編碼應該依賴於應用自己的配置。
修改mule 的源代碼,CxfInboundMessageProcessor這個類,在升級的過程中沒有改動,不然就要反編譯來獲取源碼了。
將201行的msg = out.toString();修改為如下代碼:
java 代碼
String enc = event.getMuleContext().getConfiguration().getDefaultEncoding(); msg = out.toString(enc);
從mule 的配置中得到配置的編碼格式,並在將Stream轉換為String的時候指定使用此編碼格式.至此問題解決了.
4. java8 lambda 表達式是個什麼
為了支持函數式編程,Java 8引入了Lambda表達式.
在Java 8中採用的是內部類來實現Lambda表達式.具體實現代碼,可以通過debug看, 同時通過位元組碼查看工具及反編譯工具來驗證.
自從lambda表達式成為Java語言的一部分之後,Java集合(Collections)API就面臨著大幅變化。而JSR 355(規定了Java lambda表達式的標准)的正式啟用更是使得Java集合API變的過時不堪。
盡管我們可以從頭實現一個新的集合框架(比如「Collection II」),但取代現有的集合框架是一項非常艱難的工作,因為集合介面滲透了Java生態系統的每個角落,將它們一一換成新類庫需要相當長的時間。因此,我們決定採取演化的策略(而非推倒重來)以改進集合API: 為現有的介面(例如Collection,List和Stream)增加擴展方法;
在類庫中增加新的流(stream,即java.util.stream.Stream)抽象以便進行聚集(aggregation)操作;
改造現有的類型使之可以提供流視圖(stream view);
改造現有的類型使之可以容易的使用新的編程模式,這樣用戶就不必拋棄使用以久的類庫,例如ArrayList和HashMap
(當然這並不是說集合API會常駐永存,畢竟集合API在設計之初並沒有考慮到lambda表達式。我們可能會在未來的JDK中添加一個更現代的集合類庫)。
除了上面的改進,還有一項重要工作就是提供更加易用的並行(Parallelism)庫。盡管Java平台已經對並行和並發提供了強有力的支持,然而開發者在實際工作(將串列代碼並行化)中仍然會碰到很多問題。因此,我們希望Java類庫能夠既便於編寫串列代碼也便於編寫並行代碼,因此我們把編程的重點從具體執行細節(how computation should be formed)轉移到抽象執行步驟(what computation should be perfomed)。
5. java的源代碼隱藏問題
你要的功能其實是Java代碼混淆,如果要了解Java編譯成exe,可以看「參考資料」。
下面一段文字摘自《Java 手機/PDA 程序設計入門》一書,可以做為混淆器性能的大致觀點:
筆者沒用過DashO,所以無法對其作出個人評價。所以現在僅說明筆者曾用過的產品。以筆者的個人觀點,如果就混淆的程度來說,ZKM最好,JAX中等,RetroGuard和ProGuard最差,一分錢一分貨,這是千古不變的道理。如果就功能性而言,ZKM和JAX都不錯,不過,JAX是IBM所開發的產品,因此也繼承了大部分IBM產品的最大特色,就是「功能超強,可是不易使用」,可能光是要看完JAX的設定文件就是一個很大的問題。
下面分別介紹幾種具有代表性的混淆器,對它們的產品性能進行對比。我們使用不同混淆器對同一段java代碼進行混淆,分別列出混淆後代碼反編譯的結果,並給出使用的一些直接體會。
原始java代碼:
public class SimpleBean implements Serializable {
private String[] name = {"name0","name1","name2","name3"};
private List myList = null;
public void SimpleBean() {
myList = new ArrayList(4);
}
public void init_public() {
myList.add("name");
for(int i= 1; i < 4; i++){
init_private(i);
}
}
private void init_private(int j) {
myList.add(name[j]);
}
private void writeObject(java.io.ObjectOutputStream out)
throws IOException {
}
}
一、ProGuard 4.5.1
ProGuard是一款免費的Java類文件壓縮器、優化器和混淆器。它能發現並刪除無用類、欄位(field)、方法和屬性值(attribute)。它也能優化位元組碼並刪除無用的指令。最後,它使用簡單無意義的名字來重命名你的類名、欄位名和方法名。經過以上操作的jar文件 會變得更小,並很難進行逆向工程。eclipse已經把Proguard集成在一起了。它支持腳本控制,可以使用GUI界面,字元串不加密,支持 J2ME。
類似功能的開源混淆器:
RetroGuard yGuard(RetroGuard的一個升級版本) JODE
Jad反編譯混淆後class得到的代碼:
public class SimpleBean
implements Serializable
{
public SimpleBean()
{
a_java_util_List_fld = null;
}
public void SimpleBean()
{
a_java_util_List_fld = new ArrayList(4);
}
public void init_public()
{
a_java_util_List_fld.add("name");
for(int i = 1; i < 4; i++)
{
int j = i;
SimpleBean simplebean = this;
a_java_util_List_fld.add(simplebean.a_java_lang_String_array1d_fld[j]);
}
}
private String a_java_lang_String_array1d_fld[] = {
"name0", "name1", "name2", "name3"
};
private List a_java_util_List_fld;
}
優點:
1、對內部private方法的調用進行了內聯,但基本達不到混淆效果;
2、使用文檔詳盡,混淆選項配置文件的編寫示例多;
3、混淆選項粒度較細,可以使用GUI界面,支持本地方法的保護等;
4、支持j2me,可以集成到Eclipse;
5、開源。
缺點:
1、符號混淆的命名具有提示性,字元串未加密,沒有其它的混淆措施;
2、混淆主要針對Xlet、Midlet等應用,混淆庫文件時配置文件將會很復雜。
二、Jocky
Jocky是金蝶中間件技術領袖袁紅崗先生的個人作品(舊有名稱JOC)。原本是方便Apusic 應用伺服器的開發,現在開放出來,供大家自由使用。Jocky混淆編譯器是在Sun JDK中提供的Java編譯器(javac)的基礎上完成的,修改了其中的代碼生成過程,對編譯器生成的中間代碼進行混淆,最後再生成class文件,這樣編譯和混淆只需要一個步驟就可以完成。也就是說,它是直接從源碼上做文章,這是Jocky與其它混淆編譯器最大的不同之處。另外可以在源程序中插入符號保留指令來控制哪些符號需要保留,將混淆過程與開發過程融合在一起,不需要單獨的混淆選項配置文件。Jocky的上述特點較適合於java類庫的混淆。
Jad反編譯混淆後class得到的代碼:
public class SimpleBean
implements Serializable
{
public SimpleBean()
{
this;
String as[] = new String[4];
as;
as[0] = "name0";
as;
JVM INSTR swap ;
1;
"name1";
JVM INSTR aastore ;
JVM INSTR p ;
JVM INSTR swap ;
2;
"name2";
JVM INSTR aastore ;
JVM INSTR p ;
JVM INSTR swap ;
3;
"name3";
JVM INSTR aastore ;
_$2;
_$1 = null;
return;
}
public void SimpleBean()
{
this;
JVM INSTR new #9 <Class ArrayList>;
JVM INSTR p ;
JVM INSTR swap ;
4;
ArrayList();
_$1;
}
public void init_public()
{
_$1.add("name");
for(int i = 1; i < 4; i++)
_$1(i);
}
private void _$1(int i)
{
_$1.add(_$2[i]);
}
private void writeObject(ObjectOutputStream objectoutputstream)
throws IOException
{
}
private String _$2[];
private List _$1;
}
優點:
1、除符號混淆外增加了數據混淆(字元數組初始化);
2、有一些語句反編譯只能得到位元組碼指令;
3、在Sun JDK中提供的Java編譯器(javac)的基礎上完成,編譯和混淆一體完成,不需要先生成class文件再混淆;
4、提供了Eclipse的插件,能夠直接在Eclipse中使用Jocky。
缺點:
1、混淆選項粒度較粗,使用中可能要在具體代碼中添加@preserve指令來實現,工作量大;
2、沒有控制流混淆。
三、Allatori 3.1_demo
Allatori屬於第二代混淆器,具有全方位保護你的知識產權的能力。Allatori具有以下幾種保護方式:命名混淆,流混淆,調試信息混淆,字元串編碼,以及水印技術。對於教育和非商業項目來說這個混淆器是免費的。2.1版本支持war和ear文件格式,並且允許對需要混淆代碼的應用程序添加有效日期。
Jad反編譯混淆後class得到的代碼:
public class SimpleBean
implements Serializable
{
public void init_public()
{
d.add(c.k("{u{0"));
int i = 1;
goto _L1
_L3:
H(i);
++i;
_L1:
4;
JVM INSTR icmplt 21;
goto _L2 _L3
_L2:
}
public void SimpleBean()
{
d = new ArrayList(4);
}
private void H(int a)
{
d.add(c[a]);
}
public SimpleBean()
{
d = null;
}
private void H(ObjectOutputStream objectoutputstream)
throws IOException
{
}
private String c[] = {
c.k("\177q\177te"), c.k("\177q\177td"), c.k("\177q\177tg"), c.k("\177q\177tf")
};
private List d;
}
註:c.k是為進行字元串加密額外生成的類c的靜態方法。
優點:
1、設計考慮了庫文件混淆的使用場景;
2、使用文檔詳盡,混淆選項配置文件的編寫示例多;
3、除符號混淆外,還使用了兩種高級的混淆手段:控制混淆(改寫了for循環)和字元串加密(String數組初始化);
4、混淆選項粒度較細,支持本地方法的保護等;
5、支持水印技術,允許對需要混淆的代碼添加有效日期;
6、支持j2me;
缺點:
1、商業軟體(價格附後),對教育和非商業用途免費(網站鏈接是http://www.allatori.com/price.html)。
附:價格情況
SINGLE DEVELOPER LICENSE
1 license $290
2-5 licenses $260
6-10 licenses $230
11+ licenses $200
SITE LICENSE $3750
BUSINESS LICENSE $4850
ANNUAL SUPPORT UPDATE $45
四、Zelix KlassMaster(ZKM)
Zelix KlassMaster是一個來自Zelix Pty Ltd的商業混淆器。官方文檔中關於它的混淆特性的介紹很少。它的保護功能非常強大,可以進行符號混淆和控制混淆,支持字元串的復雜加密保護,堆棧混亂,支持異常重構,支持增量混淆,支持J2ME。Zelix KlassMaster提供試用版本,可以到http://www.zelix.com下載。
五、DashO Pro
DashO Pro 是由Preemptive Solutions開發的商業化的混淆器. 免費的評估版可以到http://www.preemptive.com下載。DashO Pro代碼保護能力強大易用,方便靈活(商業軟體,非開源)。該Java混淆器是Sun的選擇,對於企業級應用,作為其Java開發包的一部分,Sun微系統使用DashO Pro來混淆其加密庫。DashO Pro能夠對ID進行重新命名,使之成為毫無意義的字元;混淆元數據;改變控制流等,所有這些操作使得java代碼被混淆,難於理解。產品特點包括:
領先的Java源碼保護機制;
運用專利Overload-Inction技術對包/類/方法/域進行重命名;
高級的流程式控制制混淆機制;
字元串加密技術;
防止反編譯器生成有用的輸出;
水印軟體;
提高Java源碼效率;
不採用類/方法/域,全面移除常數存儲庫;
類/方法級別的優化,以提高JIT效果;
動態載入檢測到的類;
全面高效的Java源碼的拓展和部署;
支持所有的JDK版本 (JSE, J2EE, J2ME, etc)包括1.5;
自動堆棧跟蹤轉換;
在指定路徑打包或者java jars;
支持任何打包類型的Java內容——程序、庫、applets程序、小伺服器程序、EJB等;支持基於J2ME CLDC的架構,包括MIDP和 iAppli;
支持CLDC預檢驗庫中的類;
可以從指定路徑、Zip壓縮包或者jars中提取;
支持導出100%純粹的Java,並提供驗證;
命令行介面適合集成到構建環境內;
基於XML的配置文件,易於使用;
全面准確的PDF格式用戶指南。