BlogJava 聯(lián)系 聚合 管理  

          Blog Stats

          隨筆檔案

          exams


          java世界

          世界Java

          2007年12月9日 #

          1.錯(cuò)誤提示內(nèi)容:Can‘t find class HelloworldApp
          

            解釋?zhuān)海ó?dāng)鍵入java HelloWorldApp時(shí)發(fā)生該錯(cuò)誤。)

            系統(tǒng)找不到名為HelloWorldApp的類(lèi)文件。一般地,該錯(cuò)誤意味著類(lèi)名拼寫(xiě)和源文件名不一樣,系統(tǒng)創(chuàng)建filename.class文件時(shí)使用的是類(lèi)定義的名字,并且區(qū)分大小寫(xiě)。

            例如:

            class HelloWorldapp(…)

            經(jīng)編譯后將創(chuàng)建HelloWorldapp.class類(lèi)。執(zhí)行時(shí),也要使用這個(gè)名字。發(fā)生這個(gè)錯(cuò)誤時(shí),可以使用文件查看命令I(lǐng)s或dir看看當(dāng)前目錄下是否存在相應(yīng)的文件,并檢查文件名的大小寫(xiě)。

            2.錯(cuò)誤提示內(nèi)容:In class HelloWorldApp:main must be public and static

            解釋?zhuān)喝绻鹠ain()方法的左側(cè)缺少static或public,會(huì)發(fā)生這個(gè)錯(cuò)誤。前面已經(jīng)解釋過(guò)對(duì)main()方法前面的修飾符有特殊的要求。

            3.文件中含有的類(lèi)個(gè)數(shù)錯(cuò)誤

            解釋?zhuān)喊凑認(rèn)ava規(guī)則,在一個(gè)源文件中最多只能定義一個(gè)公有類(lèi),否則會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤。如果一個(gè)應(yīng)用系統(tǒng)中有多個(gè)公有類(lèi),則要把它們分別放在各自不同的文件中。文件中非公有類(lèi)的個(gè)數(shù)不限。

            4.層次錯(cuò)誤

            解釋?zhuān)阂粋€(gè)。java源文件可以含有三個(gè)“頂層”元素,這三個(gè)元素是:

            (1)一個(gè)包說(shuō)明,即package語(yǔ)句,包說(shuō)明是可選的。

            (2)任意多個(gè)引入語(yǔ)句,即import語(yǔ)句。

            (3)類(lèi)和接口說(shuō)明。

            這些語(yǔ)句必須按一定的次序出現(xiàn),即,引入語(yǔ)句必須出現(xiàn)在所有的類(lèi)說(shuō)明之前,如果使用了包說(shuō)明,則它必須出現(xiàn)在類(lèi)說(shuō)明和引入語(yǔ)句之前。

            例如,下面是正確的語(yǔ)句序列:

            package Transportation;

            import jaya.awt.Graphics

            import jays.applet.Applet;

            下面是兩例錯(cuò)誤的語(yǔ)句順序:

            import java.aWt.Graphics

            import java.applet.Applet;

            package Transportation;

            該例中在包說(shuō)明語(yǔ)句之前含有其他語(yǔ)句。

            package Transportation;

            package House;

            import java.applet.Applet;

            該例中含有兩個(gè)包說(shuō)明語(yǔ)句。HP0-345 HP0-634

          1.錯(cuò)誤提示內(nèi)容:Can‘t find class HelloworldApp

            解釋?zhuān)海ó?dāng)鍵入java HelloWorldApp時(shí)發(fā)生該錯(cuò)誤。)

            系統(tǒng)找不到名為HelloWorldApp的類(lèi)文件。一般地,該錯(cuò)誤意味著類(lèi)名拼寫(xiě)和源文件名不一樣,系統(tǒng)創(chuàng)建filename.class文件時(shí)使用的是類(lèi)定義的名字,并且區(qū)分大小寫(xiě)。

            例如:

            class HelloWorldapp(…)

            經(jīng)編譯后將創(chuàng)建HelloWorldapp.class類(lèi)。執(zhí)行時(shí),也要使用這個(gè)名字。發(fā)生這個(gè)錯(cuò)誤時(shí),可以使用文件查看命令I(lǐng)s或dir看看當(dāng)前目錄下是否存在相應(yīng)的文件,并檢查文件名的大小寫(xiě)。

            2.錯(cuò)誤提示內(nèi)容:In class HelloWorldApp:main must be public and static

            解釋?zhuān)喝绻鹠ain()方法的左側(cè)缺少static或public,會(huì)發(fā)生這個(gè)錯(cuò)誤。前面已經(jīng)解釋過(guò)對(duì)main()方法前面的修飾符有特殊的要求。

            3.文件中含有的類(lèi)個(gè)數(shù)錯(cuò)誤

            解釋?zhuān)喊凑認(rèn)ava規(guī)則,在一個(gè)源文件中最多只能定義一個(gè)公有類(lèi),否則會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤。如果一個(gè)應(yīng)用系統(tǒng)中有多個(gè)公有類(lèi),則要把它們分別放在各自不同的文件中。文件中非公有類(lèi)的個(gè)數(shù)不限。

            4.層次錯(cuò)誤

            解釋?zhuān)阂粋€(gè)。java源文件可以含有三個(gè)“頂層”元素,這三個(gè)元素是:

            (1)一個(gè)包說(shuō)明,即package語(yǔ)句,包說(shuō)明是可選的。

            (2)任意多個(gè)引入語(yǔ)句,即import語(yǔ)句。HP0-645 HP0-661

            (3)類(lèi)和接口說(shuō)明。

            這些語(yǔ)句必須按一定的次序出現(xiàn),即,引入語(yǔ)句必須出現(xiàn)在所有的類(lèi)說(shuō)明之前,如果使用了包說(shuō)明,則它必須出現(xiàn)在類(lèi)說(shuō)明和引入語(yǔ)句之前。

            例如,下面是正確的語(yǔ)句序列:

            package Transportation;

            import jaya.awt.Graphics

            import jays.applet.Applet;

            下面是兩例錯(cuò)誤的語(yǔ)句順序:

            import java.aWt.Graphics

            import java.applet.Applet;

            package Transportation;

            該例中在包說(shuō)明語(yǔ)句之前含有其他語(yǔ)句。

            package Transportation;

            package House;

            import java.applet.Applet;

            該例中含有兩個(gè)包說(shuō)明語(yǔ)句。

          posted @ 2008-03-01 09:55 java2java 閱讀(1251) | 評(píng)論 (1)編輯 收藏

          一 JAVA 類(lèi)中
          1。取出指定所在類(lèi)的路徑

          class A {
          String getPath() {
               return this.getClass().getClassLoader().getSystemResource("A").getPath();
              }
          }

          2。取出類(lèi)ClassLoader的開(kāi)始路徑(執(zhí)行路徑)
          //String preUri=this.getClass().getClassLoader().getResource("").getPath();

          比如WebApp的項(xiàng)目,以下的指令得出的結(jié)果就是

          /D:/project/crFj163Web/web/exploded/WEB-INF/classes/

          比如你是純java的程序,就是你執(zhí)行java指令的當(dāng)前路徑

          3。取出jdk所在的bin目錄

          //得到當(dāng)前用戶路徑,執(zhí)行路徑 System.getProperty(”user.dir”)

          其中user.dir是一個(gè)參數(shù),更多參數(shù)請(qǐng)看這里

          二、jsp/servlet 中的取路徑

          以前我們常用getRealPath(),不過(guò)這個(gè)方法已經(jīng)不推薦用了。但我們可以使用request.getContextPath().另外還有request.getRequestURL() 或者request.getRequestURI()。下面舉例,以建立一個(gè)app1的webapp為例

          1。request.getContextPath()打印出來(lái)的是

          /app1

          2。request.getRequestURL() 打印出來(lái)的是

          http://localhost:8080/app1/index.jsp

          3。request.getRequestURI() 打印出來(lái)的是

          /app1/index.jsp

          轉(zhuǎn)載(  190-721 000-746 )
          posted @ 2008-01-10 11:35 java2java 閱讀(1217) | 評(píng)論 (0)編輯 收藏

           
          import java.sql.*;

          public class Create {
          public Create() {
          }
          public static void main(String[] args){
          String url = "jdbc:oracle:thin:@10.0.1.3:1521:SDCDB";
          String query = "CREATE TABLE MYFIRST" + "(id INT,name CHAR(10))";
          String sql="insert into MYFIRST values(''1'',''liming'')";
          String sql1="insert into MYFIRST values(''2'',''mm'')";
          String sql2="delete MYFIRST where id=2";
          try
          {
          Class.forName("oracle.jdbc.driver.OracleDriver");
          Connection conn = DriverManager.getConnection(url, "test", "test");
          Statement stmt = conn.createStatement();
          stmt.executeUpdate(query);
          stmt.executeUpdate(sql);
          stmt.executeUpdate(sql1);
          stmt.executeUpdate(sql2);
          System.out.println("Create Success!");
          stmt.close();
          conn.close();
          }
          catch(java.lang.ClassNotFoundException e){
          System.err.print(e.getMessage());
          }
          catch(SQLException ex){
          System.out.println("\n***SQLException caught ***\n");
          }
          }
          }
          posted @ 2008-01-10 10:54 java2java 閱讀(1725) | 評(píng)論 (0)編輯 收藏

           Sun Java認(rèn)證分為兩個(gè)級(jí)別:Sun 認(rèn)證Java程序員和Sun 認(rèn)證Java開(kāi)發(fā)員。Sun 認(rèn)證Java程序員考試內(nèi)容涉及Java所有相關(guān)知識(shí)、編程概念及applet開(kāi)發(fā)技巧。Sun認(rèn)證Java程序員考試旨在考察您通過(guò)應(yīng)用軟件分配進(jìn)行復(fù)雜編程的能力。之后還要測(cè)試您完成編程所需的知識(shí)。每次考試都包括65道以上的多項(xiàng)選擇題,時(shí)間大約為90分鐘。考試合格后由Sun公司頒發(fā)的國(guó)際通用的Java程序員證書(shū)。

             Java程序員
             概述:本課程使學(xué)員掌握如何使用標(biāo)準(zhǔn)Java Development kit(JDK)開(kāi)發(fā)應(yīng)用程序和applets。在本課程中您將學(xué)會(huì)Java語(yǔ)言的語(yǔ)法。如何使用Java來(lái)創(chuàng)建圖形用戶接口(GUI),事件處理機(jī)制,例外處理,通過(guò)設(shè)計(jì)與開(kāi)發(fā)各種Java程序來(lái)獲得實(shí)際的編程經(jīng)驗(yàn)。您也將學(xué)到文件輸入/輸出(I/O),多線程和網(wǎng)絡(luò)的知識(shí)。

             目標(biāo):本課程完成后,您將具備以下能力:
             使用Java編程語(yǔ)言創(chuàng)建Java應(yīng)用程序和applets
             定義和描述垃圾搜集,安全性和Java虛擬機(jī)(JVM)
             描述和使用Java語(yǔ)言面向?qū)ο蟮奶攸c(diǎn);開(kāi)發(fā)圖形用戶接口(GUI)
             利用Java支持的多種布局管理
             描述和使用 Java的事件處理模式
             使用Java語(yǔ)言的鼠標(biāo)輸入,文本,窗口和菜單窗口部件
             使用Java的例外處理來(lái)控制程序執(zhí)行和定義用戶自己的例外事件
             使用Java語(yǔ)言的先進(jìn)的面向?qū)ο筇攸c(diǎn),包括方法重載,方法覆蓋,抽象類(lèi),接口,final,static和訪問(wèn)控制;實(shí)現(xiàn)文件的輸入輸出(I/O)
             使用Java語(yǔ)言內(nèi)在的線程模式來(lái)控制多線程
             使用Java的Sockets機(jī)制進(jìn)行網(wǎng)絡(luò)通信
             預(yù)備知識(shí):熟悉DOS操作,用過(guò)WINDOWS并能用C或C++編程。

             Java開(kāi)發(fā)員
             概述:本課程將提供給學(xué)員設(shè)計(jì)資料服務(wù)器應(yīng)用法的實(shí)際設(shè)計(jì)方法,學(xué)員將使用Java聲音、圖形、網(wǎng)絡(luò)通訊等接口,編寫(xiě)與服務(wù)器相連接的Java應(yīng)用程度,通過(guò)本課程學(xué)員還能學(xué)到如何在Java程序中調(diào)用本機(jī)用其它計(jì)算機(jī)語(yǔ)言編寫(xiě)的程序 117-102 117-301 190-721 。

             本課程是為熟悉Java語(yǔ)言結(jié)構(gòu)及語(yǔ)法的程序員而設(shè)立的。以便他們能在本課程中獲得開(kāi)發(fā)復(fù)雜的、產(chǎn)品級(jí)的Java應(yīng)用技術(shù)。
             目標(biāo):在學(xué)完本課程后,學(xué)員將能夠:
             設(shè)計(jì)和開(kāi)發(fā)Java GUI
             設(shè)計(jì)和開(kāi)發(fā)動(dòng)畫(huà)Java應(yīng)用程序
             掌握了Java網(wǎng)絡(luò)編程技術(shù)
             懂得了JDBC-API的基本結(jié)構(gòu)
             知道UNIX與Windows NT互連有哪些技術(shù)問(wèn)題
             能夠解釋在Java程序中調(diào)用其它語(yǔ)言所編寫(xiě)的程序的方法與步驟

             Sun認(rèn)證Java程序員考試(JDK1.1)由一門(mén)考試組成,可以用來(lái)測(cè)試考生對(duì)Java語(yǔ)言的掌握程度。考生可以使用考試大綱(exam objectives)作為準(zhǔn)備考試的工具。
             為了保證Sun客戶使用的是Sun的最新技術(shù),Sun Educational Services已經(jīng)把Sun認(rèn)證Java程序員考試更新為JDK1.1。

             考試細(xì)則
             考試名稱(chēng):
             The Sun Certified Java Programmer for JDK 1.1
             考試號(hào):
             310-022(IBM考生除外),310-023(只對(duì)IBM考生)
             推薦教材:
             SL-275 “Java Programming(UNIX)”
             SL-276“Java Progrmming(Windows 95)”
             JTL-SL-275“Java Tutor:Java Programming Library”
             題數(shù):60
             考題類(lèi)型:多選/簡(jiǎn)答
             通過(guò)分?jǐn)?shù): 70%
             考試時(shí)間: 2小時(shí)
             考試費(fèi)用: $150
          posted @ 2008-01-07 10:11 java2java 閱讀(562) | 評(píng)論 (2)編輯 收藏

          在ChinaITLAB導(dǎo)師制輔導(dǎo)中,筆者發(fā)現(xiàn)問(wèn)得最多的問(wèn)題莫過(guò)于"如何學(xué)習(xí)編程?JAVA該如何學(xué)習(xí)?"。類(lèi)似的問(wèn)題回答多了,難免會(huì)感覺(jué)厭煩,就萌生了寫(xiě)下本文的想法。到時(shí)候再有人問(wèn)起類(lèi)似的問(wèn)題,我可以告訴他(她),請(qǐng)你去看看《JAVA學(xué)習(xí)之路》。拜讀過(guò)臺(tái)灣蔡學(xué)鏞先生的《JAVA夜未眠》,有些文章如《JAVA學(xué)習(xí)之道》等讓我們確實(shí)有共鳴,本文題目也由此而來(lái)。
            軟件開(kāi)發(fā)之路是充滿荊棘與挑戰(zhàn)之路,也是充滿希望之路。JAVA學(xué)習(xí)也是如此,沒(méi)有捷徑可走。夢(mèng)想像《天龍八部》中虛竹一樣被無(wú)崖子醍醐灌頂而輕松獲得一甲子功力,是很不現(xiàn)實(shí)的。每天仰天大叫"天神啊,請(qǐng)賜給我一本葵花寶典吧",殊不知即使你獲得了葵花寶典,除了受自宮其身之苦外,你也不一定成得了"東方不敗",倒是成"西方失敗"的幾率高一點(diǎn)。
            "不走彎路,就是捷徑",佛經(jīng)說(shuō)的不無(wú)道理。
            1.如何學(xué)習(xí)程序設(shè)計(jì)?
            JAVA是一種平臺(tái),也是一種程序設(shè)計(jì)語(yǔ)言,如何學(xué)好程序設(shè)計(jì)不僅僅適用于JAVA,對(duì)C++等其他程序設(shè)計(jì)語(yǔ)言也一樣管用。有編程高手認(rèn)為,JAVA也好C也好沒(méi)什么分別,拿來(lái)就用。為什么他們能達(dá)到如此境界?我想是因?yàn)榫幊陶Z(yǔ)言之間有共通之處,領(lǐng)會(huì)了編程的精髓,自然能夠做到一通百通。如何學(xué)習(xí)程序設(shè)計(jì)理所當(dāng)然也有許多共通的地方。
            1.1 培養(yǎng)興趣
            興趣是能夠讓你堅(jiān)持下去的動(dòng)力。如果只是把寫(xiě)程序作為謀生的手段的話,你會(huì)活的很累,也太對(duì)不起自己了。多關(guān)心一些行業(yè)趣事,多想想蓋茨。不是提倡天天做白日夢(mèng),但人要是沒(méi)有了夢(mèng)想,你覺(jué)得有味道嗎?可能像許多深圳本地農(nóng)民一樣,打打麻將,喝喝功夫茶,拜拜財(cái)神爺;每個(gè)月就有幾萬(wàn)十幾萬(wàn)甚至更多的進(jìn)帳,憑空多出個(gè)"食利階層"。你認(rèn)為,這樣有味道嗎?有空多到一些程序員論壇轉(zhuǎn)轉(zhuǎn),你會(huì)發(fā)現(xiàn),他們其實(shí)很樂(lè)觀幽默,時(shí)不時(shí)會(huì)冒出智慧的火花。
            1.2 慎選程序設(shè)計(jì)語(yǔ)言
            男怕入錯(cuò)行,女怕嫁錯(cuò)郎。初學(xué)者選擇程序設(shè)計(jì)語(yǔ)言需要謹(jǐn)慎對(duì)待。軟件開(kāi)發(fā)不僅僅是掌握一門(mén)編程語(yǔ)言了事,它還需要其他很多方面的背景知識(shí)。軟件開(kāi)發(fā)也不僅僅局限于某幾個(gè)領(lǐng)域,而是已經(jīng)滲透到了各行各業(yè)幾乎每一個(gè)角落。
            如果你對(duì)硬件比較感興趣,你可以學(xué)習(xí)C語(yǔ)言/匯編語(yǔ)言,進(jìn)入硬件開(kāi)發(fā)領(lǐng)域。如果你對(duì)電信的行業(yè)知識(shí)及網(wǎng)絡(luò)比較熟悉,你可以在C/C++等之上多花時(shí)間,以期進(jìn)入電信軟件開(kāi)發(fā)領(lǐng)域。如果你對(duì)操作系統(tǒng)比較熟悉,你可以學(xué)習(xí)C/Linux等等,為L(zhǎng)inux內(nèi)核開(kāi)發(fā)/驅(qū)動(dòng)程序開(kāi)發(fā)/嵌入式開(kāi)發(fā)打基礎(chǔ)。如果你想介入到應(yīng)用范圍最廣泛的應(yīng)用軟件開(kāi)發(fā)(包括電子商務(wù)電子政務(wù)系統(tǒng))的話,你可以選擇J2EE或.NET,甚至LAMP組合。每個(gè)領(lǐng)域要求的背景知識(shí)不一樣。做應(yīng)用軟件需要對(duì)數(shù)據(jù)庫(kù)等很熟悉。總之,你需要根據(jù)自己的特點(diǎn)來(lái)選擇合適你的編程語(yǔ)言。
            1.3 要腳踏實(shí)地,快餐式的學(xué)習(xí)不可取
            先分享一個(gè)故事。
            有一個(gè)小朋友,他很喜歡研究生物學(xué),很想知道那些蝴蝶如何從蛹?xì)だ锍鰜?lái),變成蝴蝶便會(huì)飛。  有一次,他走到草原上面看見(jiàn)一個(gè)蛹,便取了回家,然后看著,過(guò)了幾天以后,這個(gè)蛹出了一條裂痕,看見(jiàn)里面的蝴蝶開(kāi)始掙扎,想抓破蛹?xì)わw出來(lái)。  這個(gè)過(guò)程達(dá)數(shù)小時(shí)之久,蝴蝶在蛹里面很辛苦地拼命掙扎,怎么也沒(méi)法子走出來(lái)。這個(gè)小孩看著看著不忍心,就想不如讓我?guī)蛶退桑汶S手拿起剪刀在蛹上剪開(kāi),使蝴蝶破蛹而出。  但蝴蝶出來(lái)以后,因?yàn)槌岚虿粔蛄Γ兊煤苡纺[,飛不起來(lái)。
            這個(gè)故事給我們的啟示是:欲速則不達(dá)。
            浮躁是現(xiàn)代人最普遍的心態(tài),能怪誰(shuí)?也許是貧窮落后了這么多年的緣故,就像當(dāng)年的大躍進(jìn)一樣,都想大步跨入共產(chǎn)主義社會(huì)。現(xiàn)在的軟件公司、客戶、政府、學(xué)校、培訓(xùn)機(jī)構(gòu)等等到處彌漫著浮躁之氣。就拿筆者比較熟悉的深圳IT培訓(xùn)行業(yè)來(lái)說(shuō)吧,居然有的打廣告宣稱(chēng)"參加培訓(xùn),100%就業(yè)",居然報(bào)名的學(xué)生不少,簡(jiǎn)直是藐視天下程序員。社會(huì)環(huán)境如是,我們不能改變,只能改變自己,鬧市中的安寧,彌足珍貴。許多初學(xué)者C++/JAVA沒(méi)開(kāi)始學(xué),立馬使用VC/JBuilder,會(huì)使用VC/JBuilder開(kāi)發(fā)一個(gè)Hello  World程序,就忙不迭的向世界宣告,"我會(huì)軟件開(kāi)發(fā)了",簡(jiǎn)歷上也大言不慚地寫(xiě)上"精通VC/JAVA"。結(jié)果到軟件公司面試時(shí)要么被三兩下打發(fā)走了,要么被駁的體無(wú)完膚,無(wú)地自容。到處碰壁之后才知道捧起《C++編程思想》《JAVA編程思想》仔細(xì)鉆研,早知如此何必當(dāng)初呀。
            "你現(xiàn)在講究簡(jiǎn)單方便,你以后的路就長(zhǎng)了",好象也是佛經(jīng)中的勸戒。
            1.4 多實(shí)踐,快實(shí)踐
            彭端淑的《為學(xué)一首示子侄》中有窮和尚與富和尚的故事。
            從前,四川邊境有兩個(gè)和尚,一個(gè)貧窮,一個(gè)有錢(qián)。一天,窮和尚對(duì)富和尚說(shuō):"我打算去南海朝圣,你看怎么樣?"富和尚說(shuō):"這里離南海有幾千里遠(yuǎn),你靠什么去呢?"窮和尚說(shuō):"我只要一個(gè)水缽,一個(gè)飯碗就夠了。"富和尚為難地說(shuō):"幾年前我就打算買(mǎi)條船去南海,可至今沒(méi)去成,你還是別去吧!"  一年以后,富和尚還在為租賃船只籌錢(qián),窮和尚卻已經(jīng)從南海朝圣回來(lái)了。
            這個(gè)故事可解讀為:任何事情,一旦考慮好了,就要馬上上路,不要等到準(zhǔn)備周全之后,再去干事情。假如事情準(zhǔn)備考慮周全了再上路的話,別人恐怕捷足先登了。軟件開(kāi)發(fā)是一門(mén)工程學(xué)科,注重的就是實(shí)踐,"君子動(dòng)口不動(dòng)手"對(duì)軟件開(kāi)發(fā)人員來(lái)講根本就是錯(cuò)誤的,他們提倡"動(dòng)手至上",但別害怕,他們大多溫文爾雅,沒(méi)有暴力傾向,雖然有時(shí)候蓬頭垢面的一副"比爾蓋茨"樣。有前輩高人認(rèn)為,學(xué)習(xí)編程的秘訣是:編程、編程、再編程,筆者深表贊同。不僅要多實(shí)踐,而且要快實(shí)踐。我們?cè)诳磿?shū)的時(shí)候,不要等到你完全理解了才動(dòng)手敲代碼,而是應(yīng)該在看書(shū)的同時(shí)敲代碼,程序運(yùn)行的各種情況可以讓你更快更牢固的掌握知識(shí)點(diǎn)。
            1.5 多參考程序代碼
            程序代碼是軟件開(kāi)發(fā)最重要的成果之一,其中滲透了程序員的思想與靈魂。許多人被《仙劍奇?zhèn)b傳》中凄美的愛(ài)情故事感動(dòng),悲劇的結(jié)局更有一種缺憾美。為什么要以悲劇結(jié)尾?據(jù)說(shuō)是因?yàn)閷?xiě)《仙劍奇?zhèn)b傳》的程序員失戀而安排了這樣的結(jié)局,他把自己的感覺(jué)融入到游戲中,卻讓眾多的仙劍迷扼腕嘆息。
            多多參考代碼例子,對(duì)JAVA而言有參考文獻(xiàn)[4.3],有API類(lèi)的源代碼(JDK安裝目錄下的src.zip文件),也可以研究一些開(kāi)源的軟件或框架。
            1.6 加強(qiáng)英文閱讀能力
            對(duì)學(xué)習(xí)編程來(lái)說(shuō),不要求英語(yǔ),  但不能一點(diǎn)不會(huì),。最起碼像JAVA  API文檔(參考文獻(xiàn)[4.4])這些東西還是要能看懂的,連猜帶懵都可以;旁邊再開(kāi)啟一個(gè)"金山詞霸"。看多了就會(huì)越來(lái)越熟練。在學(xué)JAVA的同時(shí)學(xué)習(xí)英文,一箭雙雕多好。另外好多軟件需要到英文網(wǎng)站下載,你要能夠找到它們,這些是最基本的要求。英語(yǔ)好對(duì)你學(xué)習(xí)有很大的幫助。口語(yǔ)好的話更有機(jī)會(huì)進(jìn)入管理層,進(jìn)而可以成為剝削程序員的"周扒皮"。
            1.7 萬(wàn)不得已才請(qǐng)教別人
            筆者在ChinaITLab網(wǎng)校的在線輔導(dǎo)系統(tǒng)中解決學(xué)生問(wèn)題時(shí)發(fā)現(xiàn),大部分的問(wèn)題學(xué)生稍做思考就可以解決。請(qǐng)教別人之前,你應(yīng)該先回答如下幾個(gè)問(wèn)題。
            你是否在google中搜索了問(wèn)題的解決辦法?
            你是否查看了JAVA  API文檔?
            你是否查找過(guò)相關(guān)書(shū)籍?
            你是否寫(xiě)代碼測(cè)試過(guò)?
            如果回答都是"是"的話,而且還沒(méi)有找到解決辦法,再問(wèn)別人不遲。要知道獨(dú)立思考的能力對(duì)你很重要。要知道程序員的時(shí)間是很寶貴的。
            1.8 多讀好書(shū)
            書(shū)中自有顏如玉。比爾?蓋茨是一個(gè)飽讀群書(shū)的人。雖然沒(méi)有讀完大學(xué),但九歲的時(shí)候比爾?蓋茨就已經(jīng)讀完了所有的百科全書(shū),所以他精通天文、歷史、地理等等各類(lèi)學(xué)科,可以說(shuō)比爾?蓋茨不僅是當(dāng)今世界上金錢(qián)的首富,而且也可以稱(chēng)得上是知識(shí)的巨富。
            筆者在給學(xué)生上課的時(shí)候經(jīng)常會(huì)給他們推薦書(shū)籍,到后來(lái)學(xué)生實(shí)在忍無(wú)可忍開(kāi)始抱怨,"天吶,這么多書(shū)到什么時(shí)候才能看完了","學(xué)軟件開(kāi)發(fā),感覺(jué)上了賊船"。這時(shí)候,我的回答一般是,"別著急,什么時(shí)候帶你們?nèi)タ纯次业臅?shū)房,到現(xiàn)在每月花在技術(shù)書(shū)籍上的錢(qián)400元,這在軟件開(kāi)發(fā)人員之中還只能夠算是中等的",學(xué)生當(dāng)場(chǎng)暈倒。(注:這一部分學(xué)生是剛學(xué)軟件開(kāi)發(fā)的)
            對(duì)于在JAVA開(kāi)發(fā)領(lǐng)域的好書(shū)在筆者另外一篇文章中會(huì)專(zhuān)門(mén)點(diǎn)評(píng)。該文章可作為本文的姊妹篇。
            1.9 使用合適的工具
            工欲善其事必先利其器。軟件開(kāi)發(fā)包含各種各樣的活動(dòng),需求收集分析、建立用例模型、建立分析設(shè)計(jì)模型、編程實(shí)現(xiàn)、調(diào)試程序、自動(dòng)化測(cè)試、持續(xù)集成等等,沒(méi)有工具幫忙可以說(shuō)是寸步難行。工具可以提高開(kāi)發(fā)效率,使軟件的質(zhì)量更高BUG更少。組合稱(chēng)手的武器。到飛花摘葉皆可傷人的境界就很高了,無(wú)招勝有招,手中無(wú)劍心中有劍這樣的境界幾乎不可企及。在筆者另外一篇文章中會(huì)專(zhuān)門(mén)闡述如何選擇合適的工具(該文章也可作為本文的姊妹篇)。
            2.軟件開(kāi)發(fā)學(xué)習(xí)路線
            兩千多年的儒家思想孔孟之道,中庸的思想透入骨髓,既不冒進(jìn)也不保守并非中庸之道,而是找尋學(xué)習(xí)軟件開(kāi)發(fā)的正確路線與規(guī)律。
            從軟件開(kāi)發(fā)人員的生涯規(guī)劃來(lái)講,我們可以大致分為三個(gè)階段,軟件工程師→軟件設(shè)計(jì)師→架構(gòu)設(shè)計(jì)師或項(xiàng)目管理師。不想當(dāng)元帥的士兵不是好士兵,不想當(dāng)架構(gòu)設(shè)計(jì)師或項(xiàng)目管理師的程序員也不是好的程序員。我們應(yīng)該努力往上走。讓我們先整理一下開(kāi)發(fā)應(yīng)用軟件需要學(xué)習(xí)的主要技術(shù)。
            A.基礎(chǔ)理論知識(shí),如操作系統(tǒng)、編譯原理、數(shù)據(jù)結(jié)構(gòu)與算法、計(jì)算機(jī)原理等,它們并非不重要。如不想成為計(jì)算機(jī)科學(xué)家的話,可以采取"用到的時(shí)候再來(lái)學(xué)"的原則。
            B.一門(mén)編程語(yǔ)言,現(xiàn)在基本上都是面向?qū)ο蟮恼Z(yǔ)言,JAVA/C++/C#等等。如果做WEB開(kāi)發(fā)的話還要學(xué)習(xí)HTML/JavaScript等等。
            C.一種方法學(xué)或者說(shuō)思想,現(xiàn)在基本都是面向?qū)ο笏枷耄∣OA/OOD/設(shè)計(jì)模式)。由此而衍生的基于組件開(kāi)發(fā)CBD/面向方面編程AOP等等。
            D.一種關(guān)系型數(shù)據(jù)庫(kù),ORACLE/SqlServer/DB2/MySQL等等
            E.一種提高生產(chǎn)率的IDE集成開(kāi)發(fā)環(huán)境JBuilder/Eclipse/VS.NET等。
            F.一種UML建模工具,用ROSE/VISIO/鋼筆進(jìn)行建模。
            G.一種軟件過(guò)程,RUP/XP/CMM等等,通過(guò)軟件過(guò)程來(lái)組織軟件開(kāi)發(fā)的眾多活動(dòng),使開(kāi)發(fā)流程專(zhuān)業(yè)化規(guī)范化。當(dāng)然還有其他的一些軟件工程知識(shí)。
            H.項(xiàng)目管理、體系結(jié)構(gòu)、框架知識(shí)。
            正確的路線應(yīng)該是:B→C→E→F→G→H。
            還需要補(bǔ)充幾點(diǎn):
            1).對(duì)于A與C要補(bǔ)充的是,我們應(yīng)該在實(shí)踐中逐步領(lǐng)悟編程理論與編程思想。新技術(shù)雖然不斷涌現(xiàn),更新速度令人眼花燎亂霧里看花;但萬(wàn)變不離其宗,編程理論與編程思想的變化卻很慢。掌握了編程理論與編程思想你就會(huì)有撥云見(jiàn)日之感。面向?qū)ο蟮乃枷朐谀壳皝?lái)講是相當(dāng)關(guān)鍵的,是強(qiáng)勢(shì)技術(shù)之一,在上面需要多投入時(shí)間,給你的回報(bào)也會(huì)讓你驚喜。
            2).對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō)是獨(dú)立學(xué)習(xí)的,這個(gè)時(shí)機(jī)就由你來(lái)決定吧。
            3).編程語(yǔ)言作為學(xué)習(xí)軟件開(kāi)發(fā)的主線,而其余的作為輔線。
            4).軟件工程師著重于B、C、E、  D;軟件設(shè)計(jì)師著重于B、C、E、  D、F;架構(gòu)設(shè)計(jì)師著重于C、F、H。
            3.如何學(xué)習(xí)JAVA?
            3.1  JAVA學(xué)習(xí)路線
            3.1.1  基礎(chǔ)語(yǔ)法及JAVA原理
            基礎(chǔ)語(yǔ)法和JAVA原理是地基,地基不牢靠,猶如沙地上建摩天大廈,是相當(dāng)危險(xiǎn)的。學(xué)習(xí)JAVA也是如此,必須要有扎實(shí)的基礎(chǔ),你才能在J2EE、J2ME領(lǐng)域游刃有余。參加SCJP(SUN公司認(rèn)證的JAVA程序員)考試不失為一個(gè)好方法,原因之一是為了對(duì)得起你交的1200大洋考試費(fèi),你會(huì)更努力學(xué)習(xí),原因之二是SCJP考試能夠讓你把基礎(chǔ)打得很牢靠,它要求你跟JDK一樣熟悉JAVA基礎(chǔ)知識(shí);但是你千萬(wàn)不要認(rèn)為考過(guò)了SCJP就有多了不起,就能夠獲得軟件公司的青睞,就能夠獲取高薪,這樣的想法也是很危險(xiǎn)的。獲得"真正"的SCJP只能證明你的基礎(chǔ)還過(guò)得去,但離實(shí)際開(kāi)發(fā)還有很長(zhǎng)的一段路要走。
            3.1.2  OO思想的領(lǐng)悟
            掌握了基礎(chǔ)語(yǔ)法和JAVA程序運(yùn)行原理后,我們就可以用JAVA語(yǔ)言實(shí)現(xiàn)面向?qū)ο蟮乃枷肓恕C嫦驅(qū)ο螅且环N方法學(xué);是獨(dú)立于語(yǔ)言之外的編程思想;是CBD基于組件開(kāi)發(fā)的基礎(chǔ);屬于強(qiáng)勢(shì)技術(shù)之一。當(dāng)以后因工作需要轉(zhuǎn)到別的面向?qū)ο笳Z(yǔ)言的時(shí)候,你會(huì)感到特別的熟悉親切,學(xué)起來(lái)像喝涼水這么簡(jiǎn)單。
            使用面向?qū)ο蟮乃枷脒M(jìn)行開(kāi)發(fā)的基本過(guò)程是:
            ●調(diào)查收集需求。
            ●建立用例模型。
            ●從用例模型中識(shí)別分析類(lèi)及類(lèi)與類(lèi)之間的靜態(tài)動(dòng)態(tài)關(guān)系,從而建立分析模型。
            ●細(xì)化分析模型到設(shè)計(jì)模型。
            ●用具體的技術(shù)去實(shí)現(xiàn)。
            ●測(cè)試、部署、總結(jié)。
            3.1.3  基本API的學(xué)習(xí)
            進(jìn)行軟件開(kāi)發(fā)的時(shí)候,并不是什么功能都需要我們?nèi)?shí)現(xiàn),也就是經(jīng)典名言所說(shuō)的"不需要重新發(fā)明輪子"。我們可以利用現(xiàn)成的類(lèi)、組件、框架來(lái)搭建我們的應(yīng)用,如SUN公司編寫(xiě)好了眾多類(lèi)實(shí)現(xiàn)一些底層功能,以及我們下載過(guò)來(lái)的JAR文件中包含的類(lèi),我們可以調(diào)用類(lèi)中的方法來(lái)完成某些功能或繼承它。那么這些類(lèi)中究竟提供了哪些方法給我們使用?方法的參數(shù)個(gè)數(shù)及類(lèi)型是?類(lèi)的構(gòu)造器需不需要參數(shù)?總不可能SUN公司的工程師打國(guó)際長(zhǎng)途甚至飄洋過(guò)海來(lái)告訴你他編寫(xiě)的類(lèi)該如何使用吧。他們只能提供文檔給我們查看,JAVA  DOC文檔(參考文獻(xiàn)4.4)就是這樣的文檔,它可以說(shuō)是程序員與程序員交流的文檔。
            基本API指的是實(shí)現(xiàn)了一些底層功能的類(lèi),通用性較強(qiáng)的API,如字符串處理/輸入輸出等等。我們又把它成為類(lèi)庫(kù)。熟悉API的方法一是多查JAVA  DOC文檔(參考文獻(xiàn)4.4),二是使用JBuilder/Eclipse等IDE的代碼提示功能。
            3.1.4  特定API的學(xué)習(xí)
            JAVA介入的領(lǐng)域很廣泛,不同的領(lǐng)域有不同的API,沒(méi)有人熟悉所有的API,對(duì)一般人而言只是熟悉工作中要用到的API。如果你做界面開(kāi)發(fā),那么你需要學(xué)習(xí)Swing/AWT/SWT等API;如果你進(jìn)行網(wǎng)絡(luò)游戲開(kāi)發(fā),你需要深入了解網(wǎng)絡(luò)API/多媒體API/2D3D等;如果你做WEB開(kāi)發(fā),就需要熟悉Servlet等API啦。總之,需要根據(jù)工作的需要或你的興趣發(fā)展方向去選擇學(xué)習(xí)特定的API。
            3.1.5  開(kāi)發(fā)工具的用法
            在學(xué)習(xí)基礎(chǔ)語(yǔ)法與基本的面向?qū)ο蟾拍顣r(shí),從鍛煉語(yǔ)言熟練程度的角度考慮,我們推薦使用的工具是Editplus/JCreator+JDK,這時(shí)候不要急于上手JBuilder/Eclipse等集成開(kāi)發(fā)環(huán)境,以免過(guò)于關(guān)注IDE的強(qiáng)大功能而分散對(duì)JAVA技術(shù)本身的注意力。過(guò)了這一階段你就可以開(kāi)始熟悉IDE了。
            程序員日常工作包括很多活動(dòng),編輯、編譯及構(gòu)建、調(diào)試、單元測(cè)試、版本控制、維持模型與代碼同步、文檔的更新等等,幾乎每一項(xiàng)活動(dòng)都有專(zhuān)門(mén)的工具,如果獨(dú)立使用這些工具的話,你將會(huì)很痛苦,你需要在堆滿工具的任務(wù)欄上不斷的切換,效率很低下,也很容易出錯(cuò)。在JBuilder、Eclipse等IDE中已經(jīng)自動(dòng)集成編輯器、編譯器、調(diào)試器、單元測(cè)試工具JUnit、自動(dòng)構(gòu)建工具ANT、版本控制工具CVS、DOC文檔生成與更新等等,甚至可以把UML建模工具也集成進(jìn)去,又提供了豐富的向?qū)椭煽蚣艽a,讓我們的開(kāi)發(fā)變得更輕松。應(yīng)該說(shuō)IDE發(fā)展的趨勢(shì)就是集成軟件開(kāi)發(fā)中要用到的幾乎所有工具。
            從開(kāi)發(fā)效率的角度考慮,使用IDE是必經(jīng)之路,也是從一個(gè)學(xué)生到一個(gè)職業(yè)程序員轉(zhuǎn)變的里程碑。
            JAVA開(kāi)發(fā)使用的IDE主要有Eclipse、JBuilder、JDeveloper、NetBeans等幾種;而Eclipse、JBuilder占有的市場(chǎng)份額是最大的。JBuilder在近幾年來(lái)一直是JAVA集成開(kāi)發(fā)環(huán)境中的霸主,它是由備受程序員尊敬的Borland公司開(kāi)發(fā),在硝煙彌漫的JAVA  IDE大戰(zhàn)中,以其快速的版本更新?lián)魯BM的Visual  Age  for  JAVA等而成就一番偉業(yè)。IBM在Visual  Age  for  JAVA上已經(jīng)無(wú)利可圖之下,干脆將之貢獻(xiàn)給開(kāi)源社區(qū),成為Eclipse的前身,真所謂"柳暗花明又一村"。浴火重生的Eclipse以其開(kāi)放式的插件擴(kuò)展機(jī)制、免費(fèi)開(kāi)源獲得廣大程序員(包括幾乎所有的骨灰級(jí)程序員)的青睞,極具發(fā)展?jié)摿Α?
            3.1.6  學(xué)習(xí)軟件工程
            對(duì)小型項(xiàng)目而言,你可能認(rèn)為軟件工程沒(méi)太大的必要。隨著項(xiàng)目的復(fù)雜性越來(lái)越高,軟件工程的必要性才會(huì)體現(xiàn)出來(lái)。參見(jiàn)"軟件開(kāi)發(fā)學(xué)習(xí)路線"小節(jié)。
            3.2學(xué)習(xí)要點(diǎn)
            確立的學(xué)習(xí)路線之后,我們還需要總結(jié)一下JAVA的學(xué)習(xí)要點(diǎn),這些要點(diǎn)在前文多多少少提到過(guò),只是筆者覺(jué)得這些地方特別要注意才對(duì)它們進(jìn)行匯總,不要嫌我婆婆媽媽啊。
            3.2.1勤查API文檔
            當(dāng)程序員編寫(xiě)好某些類(lèi),覺(jué)得很有成就感,想把它貢獻(xiàn)給各位苦難的同行。這時(shí)候你要使用"javadoc"工具(包含在JDK中)生成標(biāo)準(zhǔn)的JAVA  DOC文檔,供同行使用。J2SE/J2EE/J2ME的DOC文檔是程序員與程序員交流的工具,幾乎人手一份,除了菜鳥(niǎo)之外。J2SE  DOC文檔官方下載地址:http://java.sun.com/j2se/1.5.0/download.jsp,你可以到google搜索CHM版本下載。也可以在線查看:http://java.sun.com/j2se/1.5.0/docs/api/index.html
            對(duì)待DOC文檔要像毛主席語(yǔ)錄,早上起床念一遍,吃飯睡覺(jué)前念一遍。
            當(dāng)需要某項(xiàng)功能的時(shí)候,你應(yīng)該先查相應(yīng)的DOC文檔看看有沒(méi)有現(xiàn)成的實(shí)現(xiàn),有的話就不必勞神費(fèi)心了直接用就可以了,找不到的時(shí)候才考慮自己實(shí)現(xiàn)。使用步驟一般如下:
            ●找特定的包,包一般根據(jù)功能組織。
            ●找需要使用類(lèi),類(lèi)命名規(guī)范的話我們由類(lèi)的名字可猜出一二。
            ●選擇構(gòu)造器,大多數(shù)使用類(lèi)的方式是創(chuàng)建對(duì)象。
            ●選擇你需要的方法。
            3.2.2  查書(shū)/google->寫(xiě)代碼測(cè)試->查看源代碼->請(qǐng)教別人
            當(dāng)我們遇到問(wèn)題的時(shí)候該如何解決?
            這時(shí)候不要急著問(wèn)別人,太簡(jiǎn)單的問(wèn)題,沒(méi)經(jīng)過(guò)思考的問(wèn)題,別人會(huì)因此而瞧不起你。可以先找找書(shū),到google中搜一下看看,絕大部分問(wèn)題基本就解決了。而像"某些類(lèi)/方法如何使用的問(wèn)題",DOC文檔就是答案。對(duì)某些知識(shí)點(diǎn)有疑惑是,寫(xiě)代碼測(cè)試一下,會(huì)給你留下深刻的印象。而有的問(wèn)題,你可能需要直接看API的源代碼驗(yàn)證你的想法。萬(wàn)不得已才去請(qǐng)教別人。
            3.2.3學(xué)習(xí)開(kāi)源軟件的設(shè)計(jì)思想
            JAVA領(lǐng)域有許多源代碼開(kāi)放的工具、組件、框架,JUnit、ANT、Tomcat、Struts、Spring、Jive論壇、PetStore寵物店等等多如牛毛。這些可是前輩給我們留下的瑰寶呀。入寶山而空手歸,你心甘嗎?對(duì)這些工具、框架進(jìn)行分析,領(lǐng)會(huì)其中的設(shè)計(jì)思想,有朝一日說(shuō)不定你也能寫(xiě)一個(gè)XXX框架什么的,風(fēng)光一把。分析開(kāi)源軟件其實(shí)是你提高技術(shù)、提高實(shí)戰(zhàn)能力的便捷方法。
            3.2.4  規(guī)范的重要性
            沒(méi)有規(guī)矩,不成方圓。這里的規(guī)范有兩層含義。第一層含義是技術(shù)規(guī)范,多到http://www.jcp.org下載jsrxxx規(guī)范,多讀規(guī)范,這是最權(quán)威準(zhǔn)確最新的教材。第二層含義是編程規(guī)范,如果你使用了大量的獨(dú)特算法,富有個(gè)性的變量及方法的命名方式;同時(shí),沒(méi)給程序作注釋?zhuān)燥@示你的編程功底是多么的深厚。這樣的代碼別人看起來(lái)像天書(shū),要理解談何容易,更不用說(shuō)維護(hù)了,必然會(huì)被無(wú)情地掃入垃圾堆。java編碼規(guī)范到此查看或下載 http://java.sun.com/docs/codeconv/,中文的也有,啊,還要問(wèn)我在哪,請(qǐng)參考3.2.2節(jié)。
            3.2.5  不局限于JAVA
            很不幸,很幸運(yùn),要學(xué)習(xí)的東西還有很多。不幸的是因?yàn)橐獙W(xué)的東西太多且多變,沒(méi)時(shí)間陪老婆家人或女朋友,導(dǎo)致身心疲憊,嚴(yán)重者甚至導(dǎo)致抑郁癥。幸運(yùn)的是別人要搶你飯碗絕非易事,他們或她們需要付出很多才能達(dá)成心愿。
            JAVA不要孤立地去學(xué)習(xí),需要綜合學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)、OOP、軟件工程、UML、網(wǎng)絡(luò)編程、數(shù)據(jù)庫(kù)技術(shù)等知識(shí),用橫向縱向的比較聯(lián)想的方式去學(xué)習(xí)會(huì)更有效。如學(xué)習(xí)JAVA集合的時(shí)候找數(shù)據(jù)結(jié)構(gòu)的書(shū)看看;學(xué)JDBC的時(shí)候復(fù)習(xí)數(shù)據(jù)庫(kù)技術(shù);采取的依然是"需要的時(shí)候再學(xué)"的原則 000-834 000-861 。
            4.結(jié)束語(yǔ)
            需要強(qiáng)調(diào)的是,學(xué)習(xí)軟件開(kāi)發(fā)確實(shí)有一定的難度,也很辛苦,需要付出很多努力,但千萬(wàn)不要半途而廢。本文如果能對(duì)一直徘徊在JAVA神殿之外的朋友有所幫助的話,筆者也欣慰了。哈哈,怎么聽(tīng)起來(lái)老氣橫秋呀?沒(méi)辦法,在電腦的長(zhǎng)期輻射之下,都快變成小老頭了。最后奉勸各位程序員尤其是MM程序員,完成工作后趕快遠(yuǎn)離電腦,據(jù)《胡播亂報(bào)》報(bào)道,電腦輻射會(huì)在白皙的皮膚上面點(diǎn)綴一些小黑點(diǎn),看起來(lái)鮮艷無(wú)比……
          posted @ 2008-01-07 10:09 java2java 閱讀(1994) | 評(píng)論 (3)編輯 收藏

          首先我們來(lái)看看Java程序的反加密,也就是通常所說(shuō)的Crack過(guò)程,只有明白了這個(gè)過(guò)程,我們才能有效的對(duì)我們的程序進(jìn)行加密。

          通常我們得到的Java程序的Crack包有兩種,一種屬于KeyGen(注冊(cè)碼生成器)、一種屬于替換修改;

          我們先看第一種,當(dāng)我們找到一個(gè)應(yīng)用程序的KeyGen的時(shí)候我們總是很佩服那個(gè)做出KeyGen的人,覺(jué)得他很厲害,但是你仔細(xì)分析一下,為什么他能做出KeyGen呢?只有
          他對(duì)這個(gè)Java程序的加密算法了解的非常清楚;這種人有哪些呢?一個(gè)是那個(gè)公司里面的人,那不可能,除非內(nèi)訌,還又呢,就是猜想,反推,這個(gè)可能嗎?呵呵,更不可能,那這個(gè)算法從哪里來(lái)呢?呵呵,往往泄漏秘密的就是秘密本身……回過(guò)頭來(lái)想想,Java應(yīng)用程序怎么知道你輸入的注冊(cè)碼是否正確呢?呵呵,那你就該從應(yīng)用程序入手……
          得到的它的加密算法,自然KeyGen就不在話下了……(但是這也有列外,如果它是用的公鑰秘鑰對(duì)加密的,就沒(méi)有辦法嘍,只能用第二種方法。)

          這種辦法只適合對(duì)付只要一個(gè)注冊(cè)號(hào),別的什么都不要的情況,經(jīng)典代表Borland JBuilder & Optimizeit Suite

          再看第二種,為什么要用替換修改?我們是修改了那部分呢?不用想,肯定是License驗(yàn)證的部分,為什么我們不像上面的方法那樣找加密算法呢?原因有兩種:(1)使用上面的辦法搞不定;(2)Java程序不僅要Key,還有其他的License配置;遇到這種情況,我們只要找到用于License驗(yàn)證的類(lèi),進(jìn)行修改替換就行了。

          這種辦法使用于任何情況,經(jīng)典代表BEA WebLogic

          經(jīng)過(guò)上面的分析,我們的問(wèn)題就集中了,關(guān)鍵就是怎么找到用于License驗(yàn)證的部分或加密算法的部分,我們需要3個(gè)工具:一個(gè)是Sun公司提供的標(biāo)準(zhǔn)JVM:),一個(gè)是你
          的耐心和細(xì)心:),一個(gè)是Jad(經(jīng)典Java反編譯工具)。

          第一步是定位,這也是最關(guān)鍵的一步,我們這里以Together For JBuilder Edition為例,啟動(dòng)Together,先看看長(zhǎng)什么樣子?喔,上來(lái)就問(wèn)我要License;Ok,
          每關(guān)系,退出;找到Together的啟動(dòng)Bat文件,找到它的啟動(dòng)命令:java .....,OK,在Java啟動(dòng)的時(shí)候給一個(gè)參數(shù):“ -Xrunhprof:cpu=times”,保存,在啟動(dòng),還是要
          License,退出,這個(gè)時(shí)候,我們可以發(fā)現(xiàn),在這個(gè)目錄下多了一個(gè)“java.hprof.txt”文件,打開(kāi)一看,就是我要的JVM的Dump文件,好多內(nèi)容啊,沒(méi)關(guān)系,慢慢看來(lái)。

          我們可以看見(jiàn)這個(gè)文件里面有好多熟悉的東西啊:java.*/com.sun.*/javax.*等等,但這個(gè)不是我們關(guān)心的,我們要的是com.togethersoft.*或者是一些沒(méi)有包名的zd.d等等。(這里插一句,幾乎所有的Java應(yīng)用程序都會(huì)混淆的,其實(shí)混淆的原理也很簡(jiǎn)單,我們后面再說(shuō)。)先找找有沒(méi)有License有關(guān)的,Serach一下,嘿嘿,果然,474行:com.togethersoft.together.impl.ide.license.LicenseSetup.execute([DashoPro-V2-050200]:Unknown line),Ok上那堆classpath中的Jar包里面找一下吧(推薦用WinRAR),找到了之后用Jad反編譯,一看,這個(gè)沒(méi)有混淆,但是用了一個(gè)zae的類(lèi),這個(gè)看名字就知道混淆過(guò)了,先不理它,再看看下面一句IdeLicenseAccess.setLicense(zae1),Ok接著找到IdeLicenseAccess,哈哈,就這點(diǎn)名堂,所有的License驗(yàn)證都是走的這個(gè)類(lèi),面向?qū)ο蟮乃枷氩诲e(cuò),呵呵:)

          定位定完了,接下來(lái)的事情就是按猜想的方法修改這兩個(gè)類(lèi),屏蔽掉LicenseSetup里面execute方法的實(shí)際內(nèi)容,修改IdeLicenseAccess,讓多有的驗(yàn)證都返回true,然后編譯,替換;不要高興太早,這還沒(méi)有完呢,要有責(zé)任心!!啟動(dòng)Together,果然,這下不要License了,有啟動(dòng)畫(huà)面,進(jìn)去了,但是一片灰色,怎么回事,一看控制臺(tái),一堆錯(cuò),沒(méi)關(guān)系,就怕不出錯(cuò),查找根源,還有一個(gè)IdeLicenseUtil類(lèi)出了問(wèn)題,再反編譯,修改,替換;這下搞定了。再啟動(dòng),測(cè)試一下,OK MB7-222 70-210 1Y0-327 。

          就這樣,一個(gè)Java應(yīng)用程序搞定了。看看其實(shí)也很簡(jiǎn)單。

          再來(lái)說(shuō)說(shuō)混淆,大家可能都知道沒(méi)有經(jīng)過(guò)混淆的Java的Class反編譯回來(lái)連方法和變量的名字都不會(huì)變,這是什么原因呢?這就要追述到Class文件的結(jié)構(gòu)了,簡(jiǎn)單來(lái)說(shuō),Class文件種包含又一個(gè)常數(shù)池(constant pool)這個(gè)里面就存放了變量和方法的名稱(chēng)等一下和Class相關(guān)的東西,我們通常所說(shuō)的混淆就是用一種工具把這個(gè)常數(shù)池里面的東東弄的胡涂一點(diǎn),這樣就能騙過(guò)反編譯器和你,呵呵:)這就是為什么有時(shí)候反編譯回來(lái)的東西編譯不過(guò)去的原因。

          再回過(guò)頭來(lái)說(shuō)說(shuō)Java程序的加密;從上面的兩種方法來(lái)看,Java程序似乎是沒(méi)有什么完美的辦法進(jìn)行加密的,其實(shí)不然,我們必須遵循一些原則,才能有效的保護(hù)你的產(chǎn)品。

          原則一,盡量使用公鑰和秘鑰對(duì)進(jìn)行加密;
          原則二,不要在加密驗(yàn)證的部分使用面向?qū)ο笏枷耄海┌羊?yàn)證的方法寫(xiě)在程序的各個(gè)角落,并標(biāo)注為private final void,讓編譯器替你處理成內(nèi)聯(lián)方法;
          原則三,盡可能的大幅度混淆:)找個(gè)好點(diǎn)的混淆器

          posted @ 2008-01-03 17:51 java2java 閱讀(5411) | 評(píng)論 (5)編輯 收藏



          第一,final, finally, finalize的區(qū)別.

          final 修飾符(關(guān)鍵字)如果一個(gè)類(lèi)被聲明為final,意味著它不能再派生出新的子類(lèi),不能作為父類(lèi)被繼承。因此一個(gè)類(lèi)不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖儭1宦暶鳛閒inal的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載

          finally 再異常處理時(shí)提供 finally 塊來(lái)執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally 塊(如果有的話)。
          finalize 方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒(méi)有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在 Object 類(lèi)中定義的,因此所有的類(lèi)都繼承了它。子類(lèi)覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。

          第二,Anonymous Inner Class (匿名內(nèi)部類(lèi)) 是否可以extends(繼承)其它類(lèi),是否可以implements(實(shí)現(xiàn))interface(接口)?

          匿名的內(nèi)部類(lèi)是沒(méi)有名字的內(nèi)部類(lèi)。不能extends(繼承) 其它類(lèi),但一個(gè)內(nèi)部類(lèi)可以作為一個(gè)接口,由另一個(gè)內(nèi)部類(lèi)實(shí)現(xiàn)。

          第三,Static Nested Class 和 Inner Class的不同,說(shuō)得越多越好
          Nested Class (一般是C++的說(shuō)法),Inner Class (一般是JAVA的說(shuō)法)。Java內(nèi)部類(lèi)與C++嵌套類(lèi)最大的不同就在于是否有指向外部的引用上。具體可見(jiàn)http: //www.frontfree.net/articles/services/view.asp?id=704&page=1
          注: 靜態(tài)內(nèi)部類(lèi)(Inner Class)意味著1創(chuàng)建一個(gè)static內(nèi)部類(lèi)的對(duì)象,不需要一個(gè)外部類(lèi)對(duì)象,2不能從一個(gè)static內(nèi)部類(lèi)的一個(gè)對(duì)象訪問(wèn)一個(gè)外部類(lèi)對(duì)象

          第四,&和&&的區(qū)別。

          &是位運(yùn)算符。&&是布爾邏輯運(yùn)算符。

          第五,HashMap和Hashtable的區(qū)別。

          都屬于Map接口的類(lèi),實(shí)現(xiàn)了將惟一鍵映射到特定的值上。
          HashMap 類(lèi)沒(méi)有分類(lèi)或者排序。它允許一個(gè) null 鍵和多個(gè) null 值。
          Hashtable 類(lèi)似于 HashMap,但是不允許 null 鍵和 null 值。它也比 HashMap 慢,因?yàn)樗峭降摹?

          第六,Collection 和 Collections的區(qū)別。
          Collections是個(gè)java.util下的類(lèi),它包含有各種有關(guān)集合操作的靜態(tài)方法。
          Collection是個(gè)java.util下的接口,它是各種集合結(jié)構(gòu)的父接口。

          第七,什么時(shí)候用assert。
          斷言是一個(gè)包含布爾表達(dá)式的語(yǔ)句,在執(zhí)行這個(gè)語(yǔ)句時(shí)假定該表達(dá)式為 true。如果表達(dá)式計(jì)算為 false,那么系統(tǒng)會(huì)報(bào)告一個(gè) Assertionerror。它用于調(diào)試目的:
          assert(a > 0); // throws an Assertionerror if a <= 0
          斷言可以有兩種形式:
          assert Expression1 ;
          assert Expression1 : Expression2 ;
          Expression1 應(yīng)該總是產(chǎn)生一個(gè)布爾值。
          Expression2 可以是得出一個(gè)值的任意表達(dá)式。這個(gè)值用于生成顯示更多調(diào)試信息的 String 消息。
          斷言在默認(rèn)情況下是禁用的。要在編譯時(shí)啟用斷言,需要使用 source 1.4 標(biāo)記:
          javac -source 1.4 Test.java
          要在運(yùn)行時(shí)啟用斷言,可使用 -enableassertions 或者 -ea 標(biāo)記。
          要在運(yùn)行時(shí)選擇禁用斷言,可使用 -da 或者 -disableassertions 標(biāo)記。
          要系統(tǒng)類(lèi)中啟用斷言,可使用 -esa 或者 -dsa 標(biāo)記。還可以在包的基礎(chǔ)上啟用或者禁用斷言。
          可以在預(yù)計(jì)正常情況下不會(huì)到達(dá)的任何位置上放置斷言。斷言可以用于驗(yàn)證傳遞給私有方法的參數(shù)。不過(guò),斷言不應(yīng)該用于驗(yàn)證傳遞給公有方法的參數(shù),因?yàn)椴还苁欠駟⒂昧藬嘌裕蟹椒ǘ急仨殭z查其參數(shù)。不過(guò),既可以在公有方法中,也可以在非公有方法中利用斷言測(cè)試后置條件。另外,斷言不應(yīng)該以任何方式改變程序的狀態(tài)。

          第八,GC是什么? 為什么要有GC? (基礎(chǔ))。

          GC是垃圾收集器。Java 程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理。要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:
          System.gc()
          Runtime.getRuntime().gc()

          第九,String s = new String("xyz");創(chuàng)建了幾個(gè)String Object?

          兩個(gè)對(duì)象,一個(gè)是“xyx”,一個(gè)是指向“xyx”的引用對(duì)象s。

          第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

          Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;

          第十一,short s1 = 1; s1 = s1 + 1;有什么錯(cuò)? short s1 = 1; s1 += 1;有什么錯(cuò)?

          short s1 = 1; s1 = s1 + 1;有錯(cuò),s1是short型,s1+1是int型,不能顯式轉(zhuǎn)化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。

          第十二,sleep() 和 wait() 有什么區(qū)別? 搞線程的最?lèi)?ài)
          sleep()方法是使線程停止一段時(shí)間的方法。在sleep 時(shí)間間隔期滿后,線程不一定立即恢復(fù)執(zhí)行。這是因?yàn)樵谀莻€(gè)時(shí)刻,其它線程可能正在運(yùn)行而且沒(méi)有被調(diào)度為放棄執(zhí)行,除非(a)“醒來(lái)”的線程具有更高的優(yōu)先級(jí)
          (b)正在運(yùn)行的線程因?yàn)槠渌蚨枞?
          wait()是線程交互時(shí),如果線程對(duì)一個(gè)同步對(duì)象x 發(fā)出一個(gè)wait()調(diào)用,該線程會(huì)暫停執(zhí)行,被調(diào)對(duì)象進(jìn)入等待狀態(tài),直到被喚醒或等待時(shí)間到。

          第十三,Java有沒(méi)有g(shù)oto?
          Goto java中的保留字,現(xiàn)在沒(méi)有在java中使用。

          第十四,數(shù)組有沒(méi)有l(wèi)ength()這個(gè)方法? String有沒(méi)有l(wèi)ength()這個(gè)方法?

          數(shù)組沒(méi)有l(wèi)ength()這個(gè)方法,有l(wèi)ength的屬性。
          String有有l(wèi)ength()這個(gè)方法。

          第十五,Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類(lèi)型?

          方法的重寫(xiě)Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫(xiě)Overriding是父類(lèi)與子類(lèi)之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類(lèi)中多態(tài)性的一種表現(xiàn)。如果在子類(lèi)中定義某方法與其父類(lèi)有相同的名稱(chēng)和參數(shù),我們說(shuō)該方法被重寫(xiě) (Overriding)。子類(lèi)的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類(lèi)中的定義,對(duì)它而言,父類(lèi)中的定義如同被“屏蔽”了。如果在一個(gè)類(lèi)中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類(lèi)型,則稱(chēng)為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類(lèi)型。

          第十六,Set里的元素是不能重復(fù)的,那么用什么方法來(lái)區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別?

          Set里的元素是不能重復(fù)的,那么用iterator()方法來(lái)區(qū)分重復(fù)與否。equals()是判讀兩個(gè)Set是否相等。
          equals()和==方法決定引用值是否指向同一對(duì)象equals()在類(lèi)中被覆蓋,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類(lèi)型相配的話,返回真值。

          第十七,給我一個(gè)你最常見(jiàn)到的runtime exception。
          ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
          ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFORMatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException  190-802 000-834 000-861 117-102 117-301 190-721

          第十八,error和exception有什么區(qū)別?
          error 表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題。比如說(shuō)內(nèi)存溢出。不可能指望程序能處理這樣的情況。
          exception 表示一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題。也就是說(shuō),它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況。

          第十九,List, Set, Map是否繼承自Collection接口?
          List,Set是

          Map不是

          第二十,abstract class和interface有什么區(qū)別?

          聲明方法的存在而不去實(shí)現(xiàn)它的類(lèi)被叫做抽象類(lèi)(abstract class),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類(lèi),并為該類(lèi)聲明方法,但不能在該類(lèi)中實(shí)現(xiàn)該類(lèi)的情況。不能創(chuàng)建abstract 類(lèi)的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類(lèi)型是一個(gè)抽象類(lèi),并讓它指向具體子類(lèi)的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract 類(lèi)的子類(lèi)為它們父類(lèi)中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類(lèi)為。取而代之,在子類(lèi)中實(shí)現(xiàn)該方法。知道其行為的其它類(lèi)可以在類(lèi)中實(shí)現(xiàn)這些方法。
          接口(interface)是抽象類(lèi)的變體。在接口中,所有方法都是抽象的。多繼承性可通過(guò)實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒(méi)有一個(gè)有程序體。接口只可以定義static final成員變量。接口的實(shí)現(xiàn)與子類(lèi)相似,除了該實(shí)現(xiàn)類(lèi)不能從接口定義中繼承行為。當(dāng)類(lèi)實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類(lèi)的任何對(duì)象上調(diào)用接口的方法。由于有抽象類(lèi),它允許使用接口名作為引用變量的類(lèi)型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類(lèi)型或從接口類(lèi)型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來(lái)決定某對(duì)象的類(lèi)是否實(shí)現(xiàn)了接口。

          第二十一,abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?

          都不能

          第二十二,接口是否可繼承接口? 抽象類(lèi)是否可實(shí)現(xiàn)(implements)接口? 抽象類(lèi)是否可繼承實(shí)體類(lèi)(concrete class)?
          接口可以繼承接口。抽象類(lèi)可以實(shí)現(xiàn)(implements)接口,抽象類(lèi)是否可繼承實(shí)體類(lèi),但前提是實(shí)體類(lèi)必須有明確的構(gòu)造函數(shù)。

          第二十三,啟動(dòng)一個(gè)線程是用run()還是start()?
          啟動(dòng)一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會(huì)立即運(yùn)行。run()方法可以產(chǎn)生必須退出的標(biāo)志來(lái)停止一個(gè)線程。

          第二十四,構(gòu)造器Constructor是否可被override? 構(gòu)造器Constructor不能被繼承,因此不能重寫(xiě)Overriding,但可以被重載Overloading。

          第二十五,是否可以繼承String類(lèi)?
          String類(lèi)是final類(lèi)故不可以繼承。

          第二十六,當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法?
          不能,一個(gè)對(duì)象的一個(gè)synchronized方法只能由一個(gè)線程訪問(wèn)。

          第二十七,try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?

          會(huì)執(zhí)行,在return前執(zhí)行。

          第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?

          有C背景的程序員特別喜歡問(wèn)這種問(wèn)題。

          2 << 3

          第二十九,兩個(gè)對(duì)象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對(duì)不對(duì)?
          不對(duì),有相同的hash code。

          第三十,當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?

          是值傳遞。Java 編程語(yǔ)言只由值傳遞參數(shù)。當(dāng)一個(gè)對(duì)象實(shí)例作為一個(gè)參數(shù)被傳遞到方法中時(shí),參數(shù)的值就是對(duì)該對(duì)象的引用。對(duì)象的內(nèi)容可以在被調(diào)用的方法中改變,但對(duì)象的引用是永遠(yuǎn)不會(huì)改變的。

          第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

          switch(expr1)中,expr1是一個(gè)整數(shù)表達(dá)式。因此傳遞給 switch 和 case 語(yǔ)句的參數(shù)應(yīng)該是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

          第三十二,編程題: 寫(xiě)一個(gè)Singleton出來(lái)。

          Singleton模式主要作用是保證在Java應(yīng)用程序中,一個(gè)類(lèi)Class只有一個(gè)實(shí)例存在。
          一般Singleton模式通常有幾種種形式:
          第一種形式: 定義一個(gè)類(lèi),它的構(gòu)造函數(shù)為private的,它有一個(gè)static的private的該類(lèi)變量,在類(lèi)初始化時(shí)實(shí)例話,通過(guò)一個(gè)public的getInstance方法獲取對(duì)它的引用,繼而調(diào)用其中的方法。
          public class Singleton {
            private Singleton(){}
            //在自己內(nèi)部定義自己一個(gè)實(shí)例,是不是很奇怪?
            //注意這是private 只供內(nèi)部調(diào)用
            private static Singleton instance = new Singleton();
            //這里提供了一個(gè)供外部訪問(wèn)本class的靜態(tài)方法,可以直接訪問(wèn)  
            public static Singleton getInstance() {
              return instance;   
             }
          }
          第二種形式:
          public class Singleton {
            private static Singleton instance = null;
            public static synchronized Singleton getInstance() {
            //這個(gè)方法比上面有所改進(jìn),不用每次都進(jìn)行生成對(duì)象,只是第一次     
            //使用時(shí)生成實(shí)例,提高了效率!
            if (instance==null)
              instance=new Singleton();
          return instance;   }
          }
          其他形式:
          定義一個(gè)類(lèi),它的構(gòu)造函數(shù)為private的,所有方法為static的。
          一般認(rèn)為第一種形式要更加安全些

          第三十三 Hashtable和HashMap
          Hashtable繼承自Dictionary類(lèi),而HashMap是Java1.2引進(jìn)的Map interface的一個(gè)實(shí)現(xiàn)

          HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許

          還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因?yàn)閏ontains方法容易讓人引起誤解。

          最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在
          多個(gè)線程訪問(wèn)Hashtable時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap
          就必須為之提供外同步。

          Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異。
          posted @ 2008-01-03 17:50 java2java 閱讀(606) | 評(píng)論 (1)編輯 收藏

          問(wèn)題. 什么是 Java API for XML-Based RPC(JAX-RPC)?
            答. Java API for XML-Based RPC(JAX-RPC)使得 Java 技術(shù)開(kāi)發(fā)人員使用基于 XML 的 RPC 功能構(gòu)建 Web 應(yīng)用程序和 Web 服務(wù),此功能遵循 SOAP(簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議,Simple Object Access Protocol)1.1 規(guī)范。
            問(wèn)題. JAX-RPC 如何使用 SOAP ?
            答. 請(qǐng)參考 JSR-101 。
            問(wèn)題. 什么是 RPC?
            答. RPC 代表遠(yuǎn)程過(guò)程調(diào)用(remote procedure call),它是能使客戶端執(zhí)行其他系統(tǒng)中程序的一種機(jī)制。RPC 機(jī)制常用于分布式客戶端/服務(wù)器模型。服務(wù)器將服務(wù)定義為一系列過(guò)程,可供遠(yuǎn)程客戶端調(diào)用。
            問(wèn)題. XML 如何與 RPC 相關(guān)聯(lián)?
            答. 遠(yuǎn)程過(guò)程調(diào)用是由基于 XML 的協(xié)議來(lái)表示的,比如 SOAP 。除了定義信封結(jié)構(gòu)和編碼規(guī)則之外,SOAP 規(guī)范還定義了遠(yuǎn)程過(guò)程調(diào)用和響應(yīng)的表示慣例。
            問(wèn)題. 對(duì)于 Web 服務(wù),JAX-RPC 必須做哪些工作?
            答. 一個(gè)基于 XML 的 RPC 服務(wù)器應(yīng)用程序可以定義、描述和導(dǎo)出一個(gè)的 Web 服務(wù),如同基于 RPC 的服務(wù)一樣。WSDL(Web 服務(wù)描述語(yǔ)言,Web Service Description Language  HP0-922 )定義了一種 XML 格式,將服務(wù)描述為一組消息操作的端點(diǎn)集合。通過(guò)使用 JAX-RPC API ,開(kāi)發(fā)人員可以用 WSDL 描述來(lái)實(shí)現(xiàn)客戶端和服務(wù)。
            問(wèn)題. 客戶端與 JAX-RPC 服務(wù)之間采用什么交互模式?
            答. 有以下三種不同的模式:
            1. 同步請(qǐng)求-響應(yīng)(Synchronous Request-Response):客戶端調(diào)用遠(yuǎn)程程序并阻塞,直到它收到一個(gè)返回值或異常。
            2. 單向 RPC(One-Way RPC):客戶端調(diào)用遠(yuǎn)程過(guò)程,但自身不阻塞或等待直到收到一個(gè)返回值。JAX-RPC 客戶端的運(yùn)行時(shí)系統(tǒng)可能會(huì)拋出異常。
            3. 非阻塞 RPC 調(diào)用(Non-Blocking RPC Invocation 190-823 1Y0-614):客戶端調(diào)用遠(yuǎn)程過(guò)程,并繼續(xù)處理同一個(gè)線程的內(nèi)容而不等待返回值。此后,客戶端通過(guò)阻塞來(lái)接受返回值或輪詢返回值,以此來(lái)處理遠(yuǎn)程方法的返回。
            問(wèn)題. 遠(yuǎn)程方法調(diào)用或響應(yīng)能否傳送服務(wù)內(nèi)容信息?
            答. 是的。例如它可能會(huì)傳送唯一的事務(wù)標(biāo)識(shí)符或數(shù)字簽名。
            問(wèn)題. 為什么 xrpcc 沒(méi)有生成 WSDL 文件?
            答. xrpcc 工具實(shí)際上可以生成 WSDL 文件,但由于設(shè)計(jì)失誤,如果不指定 –keep 選項(xiàng),該文件會(huì)同源文件一起被刪除。您可以使用 –keep 選項(xiàng)讓 xrpcc 不刪除 WSDL 或 .java 源文件。如果您使用 –s sourcepath 選項(xiàng),所有源文件將被放置在 sourcepath 目錄中,然后您可以很容易地刪除它們。 WSDL 文件將被放置在當(dāng)前目錄或由 –d 選項(xiàng)指定的目錄中。
          posted @ 2007-12-09 14:47 java2java 閱讀(1273) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 礼泉县| 伊吾县| 二连浩特市| 合水县| 无棣县| 洛阳市| 内江市| 宜良县| 都兰县| 乐都县| 长宁县| 小金县| 上高县| 凌源市| 比如县| 孝昌县| 成安县| 平武县| 太和县| 黄龙县| 根河市| 贞丰县| 沿河| 砀山县| 防城港市| 天津市| 沈阳市| 永丰县| 南乐县| 信宜市| 疏附县| 中西区| 顺平县| 临城县| 阿拉善左旗| 醴陵市| 桐城市| 微博| 丽江市| 安阳县| 江西省|