<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    活到老,學(xué)到老

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      9 Posts :: 1 Stories :: 2 Comments :: 0 Trackbacks

    2011年4月7日 #

         摘要:     概念:觀察者模式定義了一對(duì)多依賴,這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),它的所有依賴者都會(huì)收到通知并自動(dòng)更新。     舉個(gè)網(wǎng)上商城的例子,比如很多顧客對(duì)某個(gè)商品感興趣,把商品收藏,當(dāng)該商品降價(jià)、促銷、有貨了等事件發(fā)生時(shí),就會(huì)發(fā)Email通知顧客。     UML圖...  閱讀全文
    posted @ 2011-04-07 22:29 simon.shen 閱讀(330) | 評(píng)論 (1)編輯 收藏

    2011年4月6日 #

        從今天開始,把常用的設(shè)計(jì)模式都簡(jiǎn)單的整理一遍,希望每個(gè)星期能至少整理2個(gè)模式吧,先從簡(jiǎn)單的策略模式開始。
        
        概念:它定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換。策略模式讓算法的變化不會(huì)影響到使用算法的客戶。
        
        策略模式很簡(jiǎn)單,實(shí)際上就是OO中的多態(tài),舉個(gè)例子,某商場(chǎng)要進(jìn)行促銷,對(duì)于普通顧客打88折,對(duì)于銀卡客戶在88折基礎(chǔ)上再滿400減160,對(duì)于金卡客戶在88折基礎(chǔ)上再滿400減200。
        
        
    UML圖如下所示:
        

        接口DiscountStrategy代碼如下:
        
    public interface DiscountStrategy {
        
    public double discount(double
     sum);
    }

        類GeneralDiscountStrategy類代碼如下:
        
    public class GeneralDiscountStrategy implements DiscountStrategy {

        @Override
        
    public double discount(double sum) 
    {
            
    return sum * 0.88
    ;
        }


    }

        類SilverDiscountStrategy類代碼如下:
        
    public class SilverDiscountStrategy implements DiscountStrategy {

        @Override
        
    public double discount(double sum) 
    {
            sum 
    = sum * 0.88
    ;
            
    int t = (int) sum / 400
    ;
            sum 
    = sum - t * 160
    ;
            
    return
     sum;
        }

    }

        類GoldenDiscountStrategy代碼如下:
        
    public class GoldenDiscountStrategy implements DiscountStrategy {

        @Override
        
    public double discount(double sum) 
    {
            sum 
    = sum * 0.88
    ;
            
    int t = (int) sum / 400
    ;
            sum 
    = sum - t * 200
    ;
            
    return
     sum;
        }

    }

        類Cashier代碼如下:
        
    public class Cashier {
        
    private DiscountStrategy discountStrategy = new
     GeneralDiscountStrategy();

        
    public void getDiscountStrategy(CustomerLevel customerLevel) 
    {
            
    switch (customerLevel) 
    {
                
    case
     GENERAL:
                    discountStrategy 
    = new
     GeneralDiscountStrategy();
                    
    break
    ;
                
    case
     SILVER:
                    discountStrategy 
    = new
     SilverDiscountStrategy();
                    
    break
    ;
                
    case
     GOLDEN:
                    discountStrategy 
    = new
     GeneralDiscountStrategy();
                    
    break
    ;
            }

        }


        
    public double calculate(double price, int num) {
            
    return discountStrategy.discount(price *
     num);
        }

    }
    posted @ 2011-04-06 22:56 simon.shen 閱讀(349) | 評(píng)論 (0)編輯 收藏

    2011年4月5日 #

         摘要:     這篇寫一個(gè)簡(jiǎn)單的HelloWorld例子。     首先準(zhǔn)備環(huán)境,我使用的JDK1.6,1.5應(yīng)該也可以。還需要去oracle下載JMX RI包,地址為:http://www.oracle.com/technetwork/java/javase/tech/download-jsp-141676.html,下載...  閱讀全文
    posted @ 2011-04-05 16:20 simon.shen 閱讀(2961) | 評(píng)論 (1)編輯 收藏

    2011年4月3日 #

        這是我讀了JMX In Action以后的總結(jié),這篇文章是這個(gè)系列的第一篇,主要介紹一下什么是JMX,為什么要使用JMX?以及簡(jiǎn)單闡述一下JMX的架構(gòu)。
        什么是JMX?
        首先看一下維基百科的定義:JMX(Java Management Extensions,即Java管理擴(kuò)展)是Java平臺(tái)上為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架。
    JMX可以跨越一系列異構(gòu)操作系統(tǒng)平臺(tái)、系統(tǒng)體系結(jié)構(gòu)和網(wǎng)絡(luò)傳輸協(xié)議,靈活的開發(fā)無(wú)縫集成的系統(tǒng)、網(wǎng)絡(luò)和服務(wù)管理應(yīng)用。
        隨著企業(yè) IT 規(guī)模的不斷增長(zhǎng),IT 資源(IT resource)數(shù)量不斷增加,IT 資源的分布也越來(lái)越分散。IT資源主要包括網(wǎng)絡(luò)和應(yīng)用等。管理網(wǎng)絡(luò)(硬件)的主要工具是
    簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP),硬件廠商一般都會(huì)在設(shè)備中提供SNMP hooks,但SNMP開發(fā)不是件容易的事情,而且需要掌握特定的語(yǔ)言,對(duì)JAVA開發(fā)者絕非易事。
        有些企業(yè)開發(fā)的應(yīng)用的時(shí)候,是不會(huì)考慮運(yùn)行時(shí)配置和管理問(wèn)題。有些企業(yè)直接在產(chǎn)品中開發(fā)管理工具和界面。也有一些企業(yè)直接使用應(yīng)用服務(wù)器或web服務(wù)器的管理工具。
        現(xiàn)實(shí)世界的IT資源管理需求主要有以下一些:
        1、監(jiān)控平臺(tái)和硬件的健康。硬件可以通過(guò)SNMP,WEB服務(wù)器和應(yīng)用服務(wù)器可以通過(guò)他們自己的管理工具。數(shù)據(jù)庫(kù)也是一樣等。
       2、配置應(yīng)用層面的資源。比如配置應(yīng)用在查詢結(jié)果中每頁(yè)顯示的數(shù)量,配置數(shù)據(jù)庫(kù)連接池,或者外部請(qǐng)求數(shù)等。
       3、收集應(yīng)用程序的統(tǒng)計(jì)信息。如多少成功訂單,多少失敗訂單等。
       4、日志級(jí)別,改變?nèi)罩炯?jí)別。出問(wèn)題的時(shí)候,可以通過(guò)改變?nèi)罩炯?jí)別來(lái)打印調(diào)試信息,快速定位問(wèn)題。
       5、監(jiān)視服務(wù)器的性能、負(fù)載,通過(guò)email、sms等通知關(guān)鍵性事件,比如服務(wù)器負(fù)載超過(guò)預(yù)設(shè)的界限。
        要滿足這些需求往往是非常昂貴和困難的,管理員通常需要通過(guò)不同的工具來(lái)管理不同的服務(wù)和硬件。 如果使用JMX,創(chuàng)建一個(gè)滿足上面需求的管理系統(tǒng)將是廉價(jià)、更加靈活、所需時(shí)間更短。    
     
        
        使用JMX的好處
         1、非常容易使用。特別是對(duì)一個(gè)JAVA程序員,要理解SNMP是困難的。而JMX對(duì)他來(lái)說(shuō)非常容易。
          2、利用現(xiàn)有的技術(shù):現(xiàn)有的管理工具可以插入JMX,JMX提供了很多協(xié)議(SNMP、HTTP)和傳輸方式(如RMI),如果原有的應(yīng)用和設(shè)備沒(méi)有提供管理能力,則可以創(chuàng)建JMX代理提供管理能力。
          3、模塊化。以模塊化的方式創(chuàng)建你的管理環(huán)境。
          4、警告、事件和統(tǒng)計(jì)信息。
            JMX提供了一套通知系統(tǒng),充分利用了面向?qū)ο髢?yōu)勢(shì),通知提供了不僅僅是數(shù)據(jù),而是一個(gè)有分布式JAVA對(duì)象,封裝了數(shù)據(jù)和行為。例如,你發(fā)送了一個(gè)服務(wù)器負(fù)載的通知,里面還包含了一個(gè)顯示負(fù)載重要性的級(jí)別的機(jī)制,說(shuō)白了就是對(duì)象里面有個(gè)方法,可以判定負(fù)載的嚴(yán)重程度。
          5、快速的監(jiān)控解決方案。不同的開發(fā)人員只需要自己開發(fā)MBean,而不需要花很多的時(shí)間在相互的協(xié)作上面,這些MBean分布在不同的主機(jī)上,但可以通過(guò)一個(gè)管理工具就可以管理所有的這些應(yīng)用。

        JMX的一些術(shù)語(yǔ)
        1、可管理資源(Manageable resource
        可以是任何的應(yīng)用、設(shè)備、或者其他存在的實(shí)體,能夠被java訪問(wèn)和包裝。是被JMX MBean管理的資源。
        2、MBean(Managed Bean)
        是滿足某些命名規(guī)則和繼承JMX 規(guī)范的java類,為可管理資源的管理和訪問(wèn)暴露接口。通過(guò)屬性和行為來(lái)暴露接口。有這3類:Standard, Dynamic, and Model MBeans。
        3、MBean Server
        管理一組MBean的JAVA類。是JMX 管理環(huán)境核心。是MBean的注冊(cè)器。
        
    4、JMX Agent
        JMX代理是為管理一組MBean提供一系列服務(wù)的java進(jìn)程。是一個(gè)MBean Server的容器,它還提供了一些有用的服務(wù):創(chuàng)建MBean之間的關(guān)系,動(dòng)態(tài)加載類,簡(jiǎn)單的監(jiān)控服務(wù),定時(shí)器服務(wù)。Agent有一個(gè)協(xié)議適配器和連接器集合能使外部程序連接到他們。
        
    5、Protocol adapters and connectors
        協(xié)議適配器和連接器是位于JMX Agent內(nèi)部的對(duì)象。把Agent暴露給管理程序和協(xié)議。一個(gè)Agent可以有很多適配器和連接器。
        
    6、Management application
        連接到JMX Agent的用戶應(yīng)用程序。
        
    7、Notification
        通知是Mbean或者M(jìn)bean server發(fā)送的java對(duì)象,他們封裝了事件、警告、或者其他的一般信息。其他的Mbean或者java對(duì)象可以注冊(cè)成為監(jiān)聽(tīng)器來(lái)接受通知。
        8、Instrumentation(設(shè)備化)
        用MBean暴露一個(gè)可管理資源的過(guò)程。
        
        JMX架構(gòu)
        JMX架構(gòu)主要分為三層:Distributed layerAgent layerInstrumentation layer,如下圖所示:
         
     

        1、Distributed layer(分布式層)
          屬于JMX架構(gòu)的最外層,這層主要負(fù)責(zé)使JMX Agent能對(duì)外部程序可用。    又分為兩種:一種通過(guò)不同的協(xié)議(如SNMP,HTTP)來(lái)為MBean提供可見(jiàn)性。
    另一種是把Agent API暴露給其他的分布式技術(shù)如RMI。
        2、The agent layer(代理層)
        它包含的最主要的組件是MBean Server,它還包括4個(gè)代理服務(wù)使管理MBean更加容易,它們分別是:    定時(shí)器(timer)、監(jiān)控服務(wù)、動(dòng)態(tài)MBean加載、和MBean關(guān)系服務(wù)。Agent可以和被管理的資源在同一個(gè)主機(jī)上,也可以是遠(yuǎn)程的。
        3、The instrumentation layer
        這是最靠近資源的一層,它包含了注冊(cè)在Agent里面的MBean。
        4、Notifications
        除了架構(gòu)中的三層以外,JMX提供了一個(gè)通知機(jī)制,類似于JAVA事件模型。通知機(jī)制是管理系統(tǒng)的最后必須的組件。Agent和MBean可以使用通知機(jī)制來(lái)發(fā)送警告或信息給管理應(yīng)用。
        以上就是JMX架構(gòu)的主要內(nèi)容,下一篇構(gòu)建一個(gè)HelloWorld的JMX程序。
    posted @ 2011-04-03 23:08 simon.shen 閱讀(2269) | 評(píng)論 (0)編輯 收藏

    2011年3月30日 #

        這本書的前面三章主要講了一下基本概念,客戶端程序,和Amazon的S3,這篇博客總結(jié)一下第四章,個(gè)人感覺(jué)有很多重要的概念。
        面向資源的架構(gòu)(The Resource-Oriented Architecture),這里的資源必須要有一個(gè)URI,資源和URI的關(guān)系:一個(gè)資源可能有一個(gè)或多個(gè)URI,而一個(gè)URI只能指定一個(gè)資源。

        Restful WS的特性:
        1、可尋址性(Addressability)
            資源通過(guò)URI來(lái)暴露給用戶,可尋址性是最基本的特性。由于可尋址性,你可以把URI保存在你的書簽里,你可以把鏈接發(fā)給別人,而不用把Html文件下載下來(lái)發(fā)給別人,也可以通過(guò)URI對(duì)資源進(jìn)行緩存。

        2、無(wú)狀態(tài)性(Statelessness
            無(wú)狀態(tài)性意味著每個(gè)HTTP請(qǐng)求是完全隔離的。每次客戶端發(fā)送請(qǐng)求都必須帶上所有服務(wù)器端需要的信息。    
            無(wú)狀態(tài)的應(yīng)用更容易分布到有負(fù)責(zé)均衡的多臺(tái)服務(wù)器上;無(wú)狀態(tài)性也更容易緩存:緩存工具只需要看這一個(gè)請(qǐng)求,和任何其他請(qǐng)求無(wú)關(guān)。
            應(yīng)用狀態(tài)和資源狀態(tài)(Application State Versus Resource State
            應(yīng)用狀態(tài)位于客戶端,而資源狀態(tài)位于服務(wù)器端,對(duì)于客戶端,每個(gè)客戶端都有各自的應(yīng)用狀態(tài),例如:在google搜索,你可能搜索某個(gè)單詞且當(dāng)前頁(yè)是第3頁(yè),我可能搜索另一個(gè)單詞且在第一頁(yè),所以每個(gè)客戶端都有一個(gè)應(yīng)用狀態(tài)。當(dāng)客戶端發(fā)起請(qǐng)求的時(shí)候,必須告訴服務(wù)器你的應(yīng)用狀態(tài),比如你當(dāng)前要看某個(gè)單詞搜索結(jié)果的第幾頁(yè),服務(wù)器端返回結(jié)果上有其他鏈接,這些鏈接客戶端可能作為未來(lái)的請(qǐng)求。
            而對(duì)于資源狀態(tài),對(duì)于每個(gè)客戶端都是相同的,就是服務(wù)器上的資源。  
      
        3、表述性(Representations
            表述性,就是資源的表現(xiàn)形式,相同的資源可以有不同的表述性,比如同一個(gè)bug列表可以用XML文檔表示,也可以用文本方式表示等等。對(duì)于同一資源的不同的Representation,如何知道客戶端請(qǐng)求哪一種呢?作者建議不同的Representation使用不同的URI。

        4、連通性(Links and Connectedness
            簡(jiǎn)單點(diǎn)說(shuō),就是返回的結(jié)果中有對(duì)其他資源的鏈接(URI),比如google搜索,搜索結(jié)果可能有其他頁(yè)的鏈接。

        5、統(tǒng)一的接口(The Uniform Interface
            也就是說(shuō)Restful WS使用HTTP的基本方法作為他的方法的表示,主要使用HTTP的四個(gè)方法:GET,PUT,DELETE,POST。HEAD和OPTIONS用的比較少。
            取得某個(gè)資源的表述的時(shí)候使用GET。
            創(chuàng)建一個(gè)新的資源的時(shí)候,PUT到一個(gè)新的URI,或者POST到一個(gè)已經(jīng)存在的URI。
            修改資源,使用PUT到存在的URI。
            刪除資源使用DELETE。
            PUT和POST都可以創(chuàng)建新的資源,那有什么區(qū)別呢?POST可以創(chuàng)建從屬資源,如一個(gè)webblog程序通過(guò)資源(/weblogs/myweblog)暴露每個(gè)blog,而某個(gè)blog下面的條目作為從屬資源為/weblogs/myweblog/entries/1,當(dāng)你需要增加一個(gè)條目的時(shí)候,你可以POST到父資源/weblogs/myweblog,同樣PUT也可以完成這個(gè)工作,在這里POST和PUT的區(qū)別是:當(dāng)客戶端可以控制新資源的URI的時(shí)候,則使用PUT,比如blog的下面的某篇文章使用名字來(lái)訪問(wèn),如/weblogs/myweblog/entries/restful_ws_1(這樣某個(gè)博客下面的文章不能重復(fù)),則當(dāng)你發(fā)表一篇新文章的時(shí)候,可以PUT到新的URI如/weblogs/myweblog/entries/restful_ws_2來(lái)創(chuàng)建資源。而如果客戶端不能控制URI的時(shí)候,比如blog是通過(guò)服務(wù)器端某個(gè)序列號(hào)來(lái)訪問(wèn),客戶端是無(wú)法知道下一個(gè)序號(hào)是什么,這時(shí)只能使用POST,這種POST如果創(chuàng)建成功,則返回201,響應(yīng)頭中的Location可以保護(hù)新創(chuàng)建資源的URI。
            還有一個(gè)區(qū)別,POST對(duì)某個(gè)存在的資源更新時(shí),一般是追加(append),比如說(shuō)對(duì)某個(gè)日志文件做POST,則把日志追加到原日志的后面。如果是PUT則進(jìn)行的是替換,所以PUT是等冪的,而POST不是(后面會(huì)講)。

            安全(Safety)
            GET和HEAD方法只是獲取資源的表述,所以是安全的。當(dāng)然也可能有一些副作用,比如有些服務(wù)端會(huì)記錄GET的次數(shù)等。

            等冪性(Idempotence)
            等冪性簡(jiǎn)單點(diǎn)說(shuō)就是一次請(qǐng)求和多次請(qǐng)求,資源的狀態(tài)是一樣。比如GET和HEAD,不論你請(qǐng)求多少次,資源還是在那里。請(qǐng)注意,DELETE和PUT也是等冪的,以為對(duì)同一個(gè)資源刪除一次或者多次,結(jié)果是一樣的,就是資源被刪除了,不存在了。為什么說(shuō)PUT也是等冪的?當(dāng)你PUT一個(gè)新資源的時(shí)候,資源被創(chuàng)建,再次PUT這個(gè)URI的時(shí)候,資源還是沒(méi)變。當(dāng)你PUT一個(gè)存在的資源時(shí),更新了資源,再次PUT的時(shí)候,還是更新成這個(gè)樣子。在PUT更新的時(shí)候,不能做相對(duì)的更新(依賴資源現(xiàn)在的狀態(tài)),比如每次對(duì)一個(gè)數(shù)加1,這樣資源狀態(tài)就會(huì)變化。應(yīng)該每次更新成某個(gè)數(shù),比如把某個(gè)數(shù)變成4,則無(wú)論多少次PUT,值都是4,這樣就是等冪了。
            我們?cè)O(shè)計(jì)Restful WS的時(shí)候,GET,HEAD, PUT, DELETE一定要設(shè)計(jì)成等冪的。由于網(wǎng)絡(luò)是不可靠的,安全性和等冪性就顯得特別重要。如果一次請(qǐng)求,服務(wù)器收到處理以后,客戶端沒(méi)有收到相應(yīng),客戶端會(huì)再次請(qǐng)求,如果沒(méi)有等冪性保障,就會(huì)發(fā)生意想不到的問(wèn)題。
            POST是不安全也不等冪的,還是拿weblog的例子,如果兩次POST相同的博文,則會(huì)產(chǎn)生兩個(gè)資源,URI可能是這樣/weblogs/myweblog/entries/1和/weblogs/myweblog/entries/2,盡管他們的內(nèi)容是一摸一樣的。
            

        

    posted @ 2011-03-30 21:59 simon.shen 閱讀(2039) | 評(píng)論 (0)編輯 收藏

    2010年2月28日 #

        雙親委派模型
        Java從1.2開始引入雙親委派模型。除了啟動(dòng)類裝載器,每個(gè)類裝載器都有一個(gè)雙親。當(dāng)類裝載器裝載某個(gè)類的時(shí)候,首先會(huì)委派它的雙親去裝載這個(gè)類,它的雙再委派自己的雙親,直到啟動(dòng)類裝載器。
        Java類裝載器的結(jié)構(gòu)如下:
         

        1、啟動(dòng)類裝載器
        主要負(fù)責(zé)裝載jdk_home/lib目錄下的核心api  或 -Xbootclasspath 選項(xiàng)指定的jar包。處于雙親委派的最頂層,該類其實(shí)是由C語(yǔ)言編寫。
        2、擴(kuò)展類裝載器
        主要負(fù)責(zé)裝載jdk_home/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包
        3、系統(tǒng)類裝載器
        主要負(fù)責(zé)裝載ClassPath下的類。
        4、自定義類裝載器
        自定義類繼承ClassLoader或其子類。可以運(yùn)行時(shí)動(dòng)態(tài)裝載某些類。
        
        


        
       
       

    posted @ 2010-02-28 18:54 simon.shen 閱讀(649) | 評(píng)論 (0)編輯 收藏

    2010年2月22日 #

    其實(shí)網(wǎng)上已經(jīng)有很多java Class文件的解析實(shí)例的文章,寫這篇博客,只是為了自己仔仔細(xì)細(xì)的按照jvm spec看一邊,別無(wú)其他。

    先上class文件的格式。

    ClassFile {
            u4 magic;
            u2 minor_version;
            u2 major_version;
            u2 constant_pool_count;
            cp_info constant_pool[constant_pool_count
    -1
    ];
            u2 access_flags;
            u2 this_class;
            u2 super_class;
            u2 interfaces_count;
            u2 interfaces[interfaces_count];
            u2 fields_count;
            field_info fields[fields_count];
            u2 methods_count;
            method_info methods[methods_count];
            u2 attributes_count;
            attribute_info attributes[attributes_count];
        }

    其中,u2代表2個(gè)字節(jié)的無(wú)符號(hào)整數(shù)。u4代表4個(gè)字節(jié)的無(wú)符號(hào)整數(shù),其他如cp_infofield_info
    是一些結(jié)構(gòu)數(shù)據(jù),接下去會(huì)講。
    這次要解析的是一個(gè)非常簡(jiǎn)單的類:TJ.java,代碼如下:
    public class TJ
    {
        
    private final int f1 = 2
    ;

        
    public int m1(int
     i){
            
    return i+1
    ;
        }

        
    private void
     m2(){
        }
    }

    使用jdk1.6編譯,產(chǎn)生的二進(jìn)制類文件如下:

    CA FE BA BE 00 00 00 32 00 16 0A 00 04 00 12 09
    00 03 00 13 07 00 14 07 00 15 01 00 02 66 31 01
    00 01 49 01 00 0D 43 6F 6E 73 74 61 6E 74 56 61
    6C 
    75 65 03 00 00 00 02 01 00 06 3C 69 6E 69 74
    3E 
    01 00 03 28 29 56 01 00 04 43 6F 64 65 01 00
    0F 4C 
    69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65
    01 00 02 6D 31 01 00 04 28 49 29 49 01 00 02 6D
    32 01 00 0A 53 6F 75 72 63 65 46 69 6C 65 01 00

    07 54 4A 2E 6A 61 76 61 0C 00 09 00 0A 0C 00 05
    00 06 01 00 02 54 4A 01 00 10 6A 61 76 61 2F 6C
    61 6E 67 2F 4F 62 6A 65 63 74 00 21 00 03 00 04

    00 00 00 01 00 12 00 05 00 06 00 01 00 07 00 00
    00 02 00 08 00 03 00 01 00 09 00 0A 00 01 00 0B
    00 00 00 26 00 02 00 01 00 00 00 0A 2A B7 00 01

    2A 
    05 B5 00 02 B1 00 00 00 01 00 0C 00 00 00 0A
    00 02 00 00 00 01 00 04 00 03 00 01 00 0D 00
     0E
    00 01 00 0B 00 00 00 1C 00 02 00 02 00 00 00 04

    1B 
    04 60 AC 00 00 00 01 00 0C 00 00 00 06 00 01
    00 00 00 06 00 02 00 0F 00 0A 00 01 00 0B 00 00
    00 19 00 00 00 01 00 00 00 01 B1 00 00 00 01 00
    0C 
    00 00 00 06 00 01 00 00 00 0B 00 01 00 10 00
    00 00 02 00 11
    下面對(duì)照上面的格式結(jié)構(gòu)一點(diǎn)點(diǎn)的解析。
    CA FE BA BE:頭四個(gè)字節(jié)是魔數(shù),表示這是java class文件。
    00 00:次版本為0。
    00 32:主版本0x32,表示jdk1.6編譯的。Jdk1.5為0x31,jdk1.4為0x30。
    00 16:常量池的入口(entry)數(shù)量。包括自己本身(這里很奇怪),所以接下來(lái)有21項(xiàng)的常量池入口。
    我會(huì)在每個(gè)常量池項(xiàng)的前面表上索引。常量池的第一個(gè)字節(jié)表示類型。具體類型對(duì)照表如下:
    Constant Type Value
    CONSTANT_Class 7
    CONSTANT_Fieldref 9
    CONSTANT_Methodref 10
    CONSTANT_InterfaceMethodref 11
    CONSTANT_String 8
    CONSTANT_Integer 3
    CONSTANT_Float 4
    CONSTANT_Long 5
    CONSTANT_Double 6
    CONSTANT_NameAndType 12
    CONSTANT_Utf8 1
    0A 00 04 00 12:【1】,第一個(gè)字節(jié)為10,所以是CONSTANT_Methodref,它的結(jié)構(gòu)如下:
    CONSTANT_Methodref_info {

    u1 tag;

    u2 class_index;

    u2 name_and_type_index;

    }

    所以,class_index=4,name_and_type_index=12,這兩個(gè)代表常量池第4項(xiàng)和第12項(xiàng)。

    09 00 03 00 13:【2】 這是一個(gè)CONSTANT_Fieldref,他的結(jié)構(gòu)和上面的類似class_index=3,name_and_type_index=13

    07 00 14:【3】這個(gè)是CONSTANT_Class,它的結(jié)構(gòu)如下:

    CONSTANT_Class_info {

        
    u1 tag;

        
    u2 name_index;

        }

    name_index為20,指向的是一個(gè)utf8的字節(jié)碼,即TJ,這個(gè)后面會(huì)看到。

    07 00 15: 【4】 也是一個(gè)CONSTANT_Class,name_index為21,即java/lang/Object

    01 00 02 66 31: 【5】CONSTANT_Utf8,結(jié)構(gòu)如下:

    CONSTANT_Utf8_info {

    u1 tag;

    u2 length;

    u1 bytes[length];

    }

    最后兩個(gè)字節(jié)代表字符串“f1”的utf-8字節(jié)碼。

    01 00 01 49:【6】字符串I

    01 00 0D 43 6F 6E 73 74 61 6E 74 56 61 6C 75 65 :【7】字符串ConstantValue

    03 00 00 00 02:【8】CONSTANT_Integer,整數(shù)值2

    01 00 06 3C 69 6E 69 74 3E:【9】字符串<init>

    01 00 03 28 29 56:【10】字符串()V

    01 00 04 43 6F 64 65:【11】字符串code

    01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65:【12】字符串LineNumberTable

    01 00 02 6D 31:【13】字符串m1

    01 00 04 28 49 29 49 :【14】字符串(I)I,表示一個(gè)整數(shù)參數(shù)且返回整數(shù)的方法。

    01 00 02 6D 32 :【15】字符串m2

    01 00 0A 53 6F 75 72 63 65 46 69 6C 65 :【16】字符串SourceFile

    01 00 07 54 4A 2E 6A 61 76 61:【17】字符串TJ.java

    0C 00 09 00 0A:【18】CONSTANT_NameAndType,結(jié)構(gòu)如下:

    CONSTANT_NameAndType_info {

    u1 tag;

    u2 name_index;

    u2 descriptor_index;

    }
    name_index=9,代表方法<init>,descriptor_index=10,()V,代表無(wú)參且返回void的方法。


    0C 00 05 00 06:【19】結(jié)構(gòu)同上,name_index=5,即f1,descriptor_index=6,即整數(shù)。

    01 00 02 54 4A :【20】字符串TJ

    01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74:【21】字符串java/lang/Object

    到此,常量池結(jié)束。
    00 21:類的描述符為public。
    00 03 :this class為常量池第三個(gè),TJ,即這個(gè)類的名字為TJ
    00 04:super class為常量池第四個(gè),java/lang/Object,即它的超類為java.lang.Object
    00 00:接口個(gè)數(shù)0。
    00 01:field數(shù)量1。
    00 12 00 05 00 06 00 01 00 07 00 00 00 02 00 08:field的結(jié)構(gòu)如下
    field_info {
         u2 access_flags;
         u2 name_index;
         u2 descriptor_index;
         u2 attributes_count;
         attribute_info attributes[attributes_count];
        }
    access_flags為00 12,代表ACC_PRIVATE+ ACC_FINAL

    name_index:常量池索引為5的入口,即f1,即類成員的名字為f1
    descriptor_index:I,代表integer。
     attributes_count:1個(gè)。
    attribute_info:
    attribute_info {
         u2 attribute_name_index;
         u4 attribute_length;
         u1 info[attribute_length];
    }

    attribute_name_index:7,即ConstantValue,結(jié)構(gòu)如下
    ConstantValue_attribute {
         u2 attribute_name_index;
         u4 attribute_length;
         u2 constantvalue_index;
        }
    attribute_length:2
    constantvalue_index:2
    ----------------------------------------下面開始方法

    00 03:3個(gè)方法。
    method_info {
         u2 access_flags;
         u2 name_index;
         u2 descriptor_index;
         u2 attributes_count;
         attribute_info attributes[attributes_count];
        }
    --------------------------------------------第一個(gè)方法<init>,這個(gè)是編譯器產(chǎn)生的生成實(shí)例的初始化方法。
    access_flags:public
    name_index:00 09,<init>
    descriptor_index:00 0A,()V表示無(wú)參數(shù),返回void
    attributes_count :00 01,1個(gè)
    attribute_name_index :00 0B ,code
    attribute_length:38個(gè)
    Code_attribute {
         u2 attribute_name_index;
         u4 attribute_length;
         u2 max_stack;
         u2 max_locals;
         u4 code_length;
         u1 code[code_length];
         u2 exception_table_length;
         {     u2 start_pc;
                u2 end_pc;
                u2  handler_pc;
                u2  catch_type;
         } exception_table[exception_table_length];
         u2 attributes_count;
         attribute_info attributes[attributes_count];
        }
    max_stack: 00 02
    max_locals: 00 01
    code_length: 00 00 00 0A,10
    code: 2A B7 00 01 2A 05 B5 00 02 B1,指令
    exception table length:00 00
    attributes_count:1
    attribute_name_index:00 0C,LineNumberTable
    LineNumberTable_attribute {
         u2 attribute_name_index;
         u4 attribute_length;
         u2 line_number_table_length;
         {  u2 start_pc;     
            u2 line_number;     
         } line_number_table[line_number_table_length];
        }
    attribute_length:10
    line_number_table_length:2
    start_pc:00 00
    line_number:00 01
    tart_pc:00 04
    line_number:00 03
    到此第一個(gè)方法結(jié)束。
    ----------------------------------------------------------------------第二個(gè)方法開始
    access_flags00 01public
    name_index:00 0D,m1
    desc_index:00 0E,(I)I,有一個(gè)整數(shù)參數(shù),返回一個(gè)整數(shù)。
    00 01:一個(gè)attr
    00 0B:code
    00 00 00 1C:attr_length:28
    Code_atrr:28個(gè)字節(jié),不分析了和上面的方法相同。

    ----------------------------------------------------------------------第三個(gè)方法
    00 02:private
    00 0F:m2
    00 0A: ()V,無(wú)參,返回void
    00 01:一個(gè)attr
    00 0B:code
    00 00 00 19:attr_length  25
    接下去的25個(gè)字節(jié)是Code_atrr,同樣不分析了。
    ------------------------------------------------------------------
    00 01:1個(gè)類的attr
    00 10:SourceFile
    00 00 00 02:len=2
    00 11:17,TJ.java

    posted @ 2010-02-22 19:30 simon.shen 閱讀(1409) | 評(píng)論 (0)編輯 收藏

    2010年1月18日 #

        搞了那么多年的程序,一直也沒(méi)去搞明白URI和URL的區(qū)別,總感覺(jué)這兩個(gè)東東差不多。看了《OReilly HTTP The Definitive Guide》,總結(jié)一下:

       從字面上理解,URI強(qiáng)調(diào)的是“資源”,而URL強(qiáng)調(diào)的是“定位”.URI更為注重資源而不太注重位置,URI對(duì)于定位Internet上的資源是更為通用的架構(gòu)

       URI有兩種形式:一種是URL,另一種是URN。

       URL表示的是某臺(tái)特定主機(jī)上的一個(gè)資源的具體路徑,是一個(gè)精確的、固定的位置。

        URN(uniform resource name)指的是某一塊特定內(nèi)容的唯一的名字,和資源所在的位置無(wú)關(guān),是location-independent的,允許資源從一個(gè)地方移到另一個(gè)地方。

        URN仍然是實(shí)驗(yàn)性的,還沒(méi)有被廣泛的采用。URN需要一個(gè)基礎(chǔ)架構(gòu)來(lái)支持解決資源定位問(wèn)題。

        所以說(shuō),現(xiàn)在URI基本上都是URL。
       
        
    posted @ 2010-01-18 21:13 simon.shen 閱讀(5967) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲AV无码一区二区乱子仑| 亚洲一区免费视频| 久久亚洲AV成人出白浆无码国产| 亚洲精品中文字幕无乱码| 亚洲va在线va天堂成人| 久久精品国产亚洲AV天海翼| 一级毛片免费全部播放| 一级毛片在线免费看| 国产精品免费观看久久| 国产免费人成在线视频| 伊伊人成亚洲综合人网7777| 亚洲视频在线观看免费| 亚洲精品av无码喷奶水糖心| caoporn国产精品免费| 国产四虎免费精品视频| 国产成人无码a区在线观看视频免费 | 两性色午夜视频免费网| 99久久99热精品免费观看国产| 色妞WWW精品免费视频| 国产a v无码专区亚洲av| 亚洲美女大bbbbbbbbb| 国产偷国产偷亚洲清高APP| 国产特黄一级一片免费| 国产免费女女脚奴视频网| 亚洲成a人一区二区三区| 亚洲国产精品一区二区久久| 亚洲国产精品无码久久98| 9i9精品国产免费久久| 在线观看无码AV网站永久免费| 一本色道久久88亚洲综合| 久久精品亚洲一区二区三区浴池| 亚洲国产成人综合精品| 国产情侣久久久久aⅴ免费| 99精品全国免费观看视频| 亚洲日韩一页精品发布| 最新亚洲卡一卡二卡三新区| a级毛片无码免费真人久久| 免费无码又爽又刺激高潮| 亚洲AV无码一区东京热久久 | 美女一级毛片免费观看| 永久免费视频网站在线观看|