一個java加密引起的問題

Jdao發表於2006-04-15
最近我在IBM的技術網站上下了一個用DWR來簡化AJAX在java平臺上應用的例子。具體可以到他的網站上去下載這個包。下完解壓後,由於小弟不才,直接用複製貼上的方式建好了web目錄,並將該目錄放在Tomact的webapps下。一切就緒後,執行貓。等啊等,好了。介面出來了,接下來就點搜尋按紐,沒有出來預想的結果,倒彈出來了一個錯誤框,說什麼找不到類什麼的錯誤。什麼原因呢,我百思不得其解,都是複製貼上啊,不應該有錯的。難道是目錄成次有問題?我想了好半天,頭都想破了,也沒則。後來我又看見原解壓目錄有個build.xml的檔案,而且還有個說明文件,說可以用它來建web,雖然我不會用這個,可是還是在Eclipse下硬著頭皮做了一個。(是按我自己的 理解做的,呵呵,可想而知結果)陷入了僵局的我抓耳撈腮。最後又到解壓目錄下,看有沒有什麼線索。哎,好象還有一個dwr-app.war這麼個檔案,這是什麼東東啊(大家不要笑,我可是出學者,想必大家才開始學的時候也有這樣的經歷)。到google搜了一搜它的副檔名,結果都是戰爭一類的,風馬牛不相及。於是加了全部的名字去搜dwr-app.war,靠,竟然沒有結果,好痛苦啊。於是用了app.war去搜,好,有結果了。看了一看。其中有一篇說可以將該檔案放在tomcat下,然後從起貓。它會自動在tomcat的webapps下建立好目錄。真的嗎,帶著疑慮我照他的作了,死馬當活馬醫吧,反正也沒其他方法了。一切作好後,我將目錄轉到webapps下,然後啟動貓。眼睛死死盯著螢幕,等待奇蹟的發生。哈哈,果然象他說的那樣,產生的一個目錄。開啟一看什麼檔案都建好了。還有這等好事,我以前咋不知道呢(大夥又要笑了,小菜鳥啊)。這個目錄的能跑嗎,帶著這個疑問,我開啟網頁,鍵入地址。頁面出來了,按一下按鈕,結果出來了。好高興啊。。。。可是我的那個複製為什麼不能跑呢?為了找原因,於是我又開始了一個最愚蠢的做法,一個一個檔案比對。jar, html,js,xml,都有啊,而且位置都一樣啊。我感到很詭異。我想今天我要找不到原因,我就不睡覺了(嘿嘿,鑽牛角尖了)。真不行,我一個一個檔案的替換。(好慘,這就是一個初級菜鳥的學習之路,好艱辛啊,55555,不知大家也是不是這樣練成大蝦的,是的話,我就心安了,否則。。。)接下來,就是純體力勞動,停貓,換檔案,起貓,開網頁,還要刪除貓下的快取。這一趟跑下來,把我弄的頭暈眼花。眼看檔案都快替換完了,最後只剩下class目錄下了,這時我真的想放棄了,按理說(其實是我的想法)class檔案都是死的,怎麼可能不一樣呢,換了也沒用。進目錄看了一下,如我想的一樣,就那幾個檔案,名字也一樣啊,真搞不懂。但是還是沒放棄替換,把class目錄一起拷過去,替換。本來是不報希望的,可是就是在失望之時給你驚喜,列表竟乖乖的出來了。啊,怎麼是這樣呢?用反編譯軟體開啟兩個class檔案進行比較。那個從war自動生成的class檔案有很完整的內容,如下:
package developerworks.ajax.store;

import java.util.*;

// Referenced classes of package developerworks.ajax.store:
// CatalogueDAO, Item, Utils

public class Cart
{

public Cart()
{
totalPrice = 0;
contents = new HashMap();
}

public Cart addItemToCart(String itemId)
{
Item item = (new CatalogueDAO()).getItem(itemId);
if(item != null)
{
totalPrice += item.getPrice();
int newQuantity = 1;
Integer oldQuantity = (Integer)contents.get(item);
if(oldQuantity != null)
newQuantity += oldQuantity.intValue();
contents.put(item, new Integer(newQuantity));
}
return this;
}

public Cart getCart()
{
return this;
}

public int getTotalPrice()
{
return totalPrice;
}

public String getFormattedTotalPrice()
{
return Utils.formatCurrency(totalPrice);
}

public Map getSimpleContents()
{
Map simpleContents = new HashMap();
Item item;
for(Iterator I = contents.keySet().iterator(); I.hasNext(); simpleContents.put(item.getName(), contents.get(item)))
item = (Item)I.next();

return simpleContents;
}

private Map contents;
private int totalPrice;
}
而我複製的class檔案卻是這樣的:
package developerworks.ajax.store;


public class Cart
{

public Cart()
{
throw new Error("Unresolved compilation problems: \n\tThe type Map is not generic; it cannot be parameterized with arguments <Item, Integer>\n\tSyntax error, parameterized types are only available if source level is 5.0\n\tcontents cannot be resolved\n\tThe type HashMap is not generic; it cannot be parameterized with arguments <Item, Integer>\n\tSyntax error, parameterized types are only available if source level is 5.0\n\tcontents cannot be resolved\n\tcontents cannot be resolved\n\tThe type Map is not generic; it cannot be parameterized with arguments <String, Integer>\n\tSyntax error, parameterized types are only available if source level is 5.0\n\tThe type Map is not generic; it cannot be parameterized with arguments <String, Integer>\n\tSyntax error, parameterized types are only available if source level is 5.0\n\tThe type HashMap is not generic; it cannot be parameterized with arguments <String, Integer>\n\tSyntax error, parameterized types are only available if source level is 5.0\n\tThe type Iterator is not generic; it cannot be parameterized with arguments <Item>\n\tSyntax error, parameterized types are only available if source level is 5.0\n\tcontents cannot be resolved\n\tcontents cannot be resolved\n");
}

public Cart addItemToCart(String itemId)
{
throw new Error("Unresolved compilation problems: \n\tcontents cannot be resolved\n\tcontents cannot be resolved\n");
}

public Cart getCart()
{
throw new Error("Unresolved compilation problem: \n");
}

public int getTotalPrice()
{
throw new Error("Unresolved compilation problem: \n");
}

public String getFormattedTotalPrice()
{
throw new Error("Unresolved compilation problem: \n");
}

private int totalPrice;
}
而在html中彈出的也正是上面的Error。我的第一反映就是加了密了。以前也聽說過什麼加密,防止反編譯。可是沒想到今天讓我這個菜鳥給遇上了。其實我想如果是個大蝦,也許根本不遇不到這個問題,因為他直接就build 或者用war檔案來建,(或許還有更好的方法,有的話在回覆時能告訴小弟)。可是就是我這個菜鳥,而且用了複製粘帖方法的菜鳥給遇上了。好了,問題解決了,我的文章也快完了。
大家在看完了這篇文章後感覺這寫的是什麼嗎,一點技術含量都沒有,是的,可是就是這些沒有一點技術含量的問題,卻成為我們這些初學者最大的拌腳石,很多人可能就是因為這些小問題而對java望而卻步,不再對java深入研究。其實,本身不在於問題是否簡單,而在於問題是不是給你造成了障礙,讓你無法繼續進行研究,這也是我發表這篇文章的目的。如何幫助我們初學者掃清障礙,讓我們度過這個難關,有更多時間來學習技術,而不是找一些低階錯誤。
所以我希望各位大蝦在看完我的文章,笑的捧腹之餘,也能理解我們這些菜鳥的無奈。最好是多寫一些經驗性的文章,也就不枉我這麼多口舌在這邊老老叨叨了。

相關文章