国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java實現學習筆記(二)

2019-11-18 11:49:41
字體:
來源:轉載
供稿:網友

  
 Java實現學習筆記(二)(圖一)


  看到Parser的代碼,你會大失所望。原來Parser也只是一個空殼子
  
 Java實現學習筆記(二)(圖二)

  圖中你可以看到經過層層查找的Parser只是一個接口而已。
  
  回想一下前面看到生成解析器代碼的時候
  
  使用了工廠模式
  
       SAXParserFactory factory = SAXParserFactory.newInstance();
  
    try {
  
      // Set up output stream
  
      out = new OutputStreamWriter(System.out, "UTF-8");
  
      // Parse the input
  
      SAXParser saxParser = factory.newSAXParser();
  
      saxParser.parse( new File(argv[0]), handler);
  
  完全由SAXParserFactory 這個類來控制產生的Parser的類型。我們只是拿來用就可以了。秘密一定藏在里面。
  
 Java實現學習筆記(二)(圖三)

  看到代碼,發現原來這個工廠自己也是一個虛類,連返回的工廠的實例都是該虛工廠的一個實現而已。
  
  再去看真正的實現org.apache.crimson.jaxp.SAXParserFactoryImpl
  
 Java實現學習筆記(二)(圖四)

  發現它又wrap了SAXParserImpl,可知SAXParserImpl是SAXParser的一個子類。
  
  繼續追蹤下去,因為SAXParserImpl繼續了SAXParser,所以它也繼續了SAXParser的方法。在SAXParserImpl體內,并沒有發現覆寫掉parser方法的地方,所以SAXParserImpl的parser也就是SAXParser的那個parser,呵呵,是不是有點繞口令的味道?那么怎么我們繞了半天,又回去了呢。再仔細看看SAXParser的parser方法
  
 Java實現學習筆記(二)(圖五)

  可以看到其實在里面的Parser parser這個實例是調用了this.getParser()這個方法來得到的。再看看SAXParser里面的getParser方法
  
 Java實現學習筆記(二)(圖六)

  是不是有點感覺了? 對了,其實這個方法就是留給繼續了SAXParser的SAXParserImpl來實現的,這樣,SAXParser的子類就可以自由的改換Parser。只要改寫掉getParser方法就可以了。
  
  急忙去看SAXParserImpl的getParser這個方法
  
 Java實現學習筆記(二)(圖七)

  你會發現你又上當了,這里又給出了很曖昧的代碼,并不是我們所猜想的那樣是一個真正的實現,再仔細看看。 注釋里面有這么句話:Adapt a SAX2 xmlReader into a SAX1 Parser。
  
  XMLReader,是不是很熟?想想看哪里看到過的?對了,剛剛在SAXParser體內Wrap的二個類,一個是我們追蹤至今的Parser,另一個就是XMLReader,原來這個XMLReader才是才是現在在用的SAX2解析器,而為了保持對以前系統的兼容才保留了SAX1解析器Parser,但其實是通過對XMLReader的Wrap得到的。只是個Adapte而已。
  
  好了,現在可以集中火力去查找XMLReader了。有了剛剛的經驗,很輕易的,我們發現,和Parser一樣,XMLReader也是一個接口:
  
 Java實現學習筆記(二)(圖八)

  
 Java實現學習筆記(二)(圖九)

  很輕易的,我們找到XMLReaderImpl
  
 Java實現學習筆記(二)(圖十)

  和里面的parse方法:
  
 Java實現學習筆記(二)(圖十)

  可以看到里面選擇parse的部分,是根據是否需要Validation選擇不同的parser的實現。
  
 Java實現學習筆記(二)(圖十二)

  Parser的真面目已經找到啦。
  
  Parser2:
  
 Java實現學習筆記(二)(圖十三)

  ValidatingParser:
  
Java實現學習筆記(二)(圖十四)

  其實,ValidatingParser也是繼續了Parser2的一個類而已,再加上了驗證合法性的功能。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盘山县| 深水埗区| 丰台区| 汉阴县| 庆云县| 鄂伦春自治旗| 米脂县| 通道| 毕节市| 岑溪市| 灵璧县| 航空| 西盟| 惠州市| 赫章县| 西盟| 革吉县| 峡江县| 盘锦市| 无锡市| 阳江市| 阿拉尔市| 林甸县| 祁东县| 昭觉县| 民县| 睢宁县| 海安县| 长治市| 遵义县| 上思县| 航空| 鄂温| 沂水县| 霍邱县| 渝北区| 彝良县| 庆元县| 富蕴县| 孟村| 化隆|