Java動態代理、XML、正則

来源:https://www.cnblogs.com/zhengyuan/archive/2018/07/27/9380050.html
-Advertisement-
Play Games

15.1 動態代理 在之後學習Spring框架時,Spring框架有一大核心思想,就是AOP,(Aspact-Oriented-Programming 面向切麵編程) 而AOP的原理就是Java的動態代理機制,在Java的動態代理機制中,有兩個重要的類或介面,一個是 InvocationHandle ...


15.1  動態代理
        在之後學習Spring框架時,Spring框架有一大核心思想,就是AOP,(Aspact-Oriented-Programming 面向切麵編程) 而AOP的原理就是Java的動態代理機制,在Java的動態代理機制中,有兩個重要的類或介面,一個是 InvocationHandler(Interface)、另一個則是 Proxy(Class),這一個類和介面是實現我們動態代理所必須用到的
15.1.1 動態代理的基礎
動態代理的基礎 : 必須有介面
Java中使用介面來定義統一的行為規範 : 介面.

介面必須有實現類:
interface SuperStar 超級明星
行為規範 :
void sing(int money);
void liveShow(int moeny);
void sleep();

// 介面必須有實現類 :
1. L implements SuperStar
2. B implements SuperStar
Proxy 代理類 :

        Class Proxy 代理類 是在運行時創建的實現指定的介面列表(稱為代理介面)的類 。 代理實例是代理類的一個實例。 每個代理實例都有一個關聯的調用處理程式對象,它實現介面InvocationHandler 。 通過其代理介面之一的代理實例上的方法調用將被分派到實例調用處理程式的invoke方法

        static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 返回指定介面的代理實例,該代理實例將方法調用分派給指定的調用處理程式。 

15.1.2 動態代理作用:   
         攔截和控制 被代理對象 的所有行為
15.1.3 InvocationHandler 調用處理器
        Interface InvocationHandler 每個代理實例都有一個關聯的調用處理程式。 當在代理實例上調用方法時,方法調用將被編碼並分派到其調用處理程式的invoke方法。

          15.1.4 案例


15.2  XML
簡介 : XML全稱為Extensible Markup Language,意思是可擴展的標記語言。

    標記 -> 用標記來修飾文本信息.
    
    可擴展 -> 標記可隨意定義.

XML技術 : 與數據相關技術, 在企業中xml技術常用來存儲數據和傳輸數據, xml之所以流行的原因在於xml語言與任何編程語言無關, xml可用於 php, java, .net任何編程語言.

        15.2.1 書寫一個xml配置文件
            xml編寫時也要符合一定的規則 :
1)xml文件的尾碼名是.xml
2)xml有且只有一個根標簽
3)xml的標簽是尖括弧包裹關鍵字成對出現的,有開始標簽有結束標簽,關鍵字是自定義的, xml也可以有空標簽/自關閉標簽
4)xml允許有屬性,屬性也是根據需要自定義的,屬性格式:屬性= "屬性值",多個屬性之間使用空格隔開
5)xml是區分大小寫的
            xml 的組成
1)文檔聲明:<?xml version="1.0" encoding="UTF-8" ?>

2)根標簽,例如: <store>

3)其他標簽,例如:<name>

4)屬性,例如:category="手機數位"

5)文本,例如:華為手機 

6)註釋,例如:<!-- 這是xml文檔的根標簽 -->

        15.2.2 約束介紹 DTD ,Schema


        15.2.3 xml 解析:

XML的實際應用場景 :

       實際開發中,我們一般會使用各種各樣的框架進行企業開發,而這些框架一般都會將某些公共的功能都已經寫好,我們需要做的只需要按照框架提供的約束進行框架的配置就可以了,當我們使用XML配置好框架後,再運行時,框架底層會解析我們配置XML文檔獲取有用的信息,從而根據我們的需求實現某些功能。

所以,實際開發中我們很少會自己編寫XML約束和解析XML.

                
 @Test
   public void test1() throws DocumentException {

       // 1. 創建一個 saxReader 解析器
       SAXReader saxReader = new SAXReader();
       // 2. 調用 read 方法讀取 xml 配置文件, 並獲取一個 document 對象
       Document document = saxReader.read("books.xml");
       // 3. 調用 getRootElement 方法, 獲取根標簽對象
       Element root = document.getRootElement();
       // 4. 調用 elements 方法, 獲取子標簽數組
       List<Element> bookElements = root.elements();
       // 5. 遍歷 bookElements 數組
       for (Element book : bookElements) {
           // 6. 調用 attributeValue 方法, 傳入屬性名稱, 獲取對應的屬性值
           String author = book.attributeValue("author");
           System.out.println("author = " + author);

           // 7. 獲取子標簽
           List<Element> elements = book.elements();
           // 8. 遍歷子標簽
           for (Element e : elements) {
               // 9. 獲取標簽名稱, 和標簽體數據
               String name = e.getName();
               String text = e.getText();
               System.out.println(name + " = " + text);
          }
      }
  }

輸出結果 :
author = 張三豐
name = Java從入門到精通
price = 98
author = 滅絕師太
name = Java編程思想
price = 998
   @Test
   public void test2() throws DocumentException {
       // 1. 創建一個 saxReader 解析器
       SAXReader saxReader = new SAXReader();
       // 2. 調用 read 方法讀取 xml 配置文件, 並獲取一個 document 對象
       Document document = saxReader.read("beans.xml");
       // 3. 調用 getRootElement 方法, 獲取根標簽對象
       Element root = document.getRootElement();
       // 4. 調用 elements 方法, 獲取子標簽數組
       List<Element> beanElements = root.elements();
       // 5. 調用 elements 方法, 獲取子標簽數組
       for (Element bean : beanElements) {
           // 6. 調用 attributeValue 方法, 傳入屬性名稱, 獲取對應的屬性值
           String id = bean.attributeValue("id");
           String className = bean.attributeValue("className");
           System.out.println(id + " = " + className);
           // 7. 調用 elements 方法, 獲取子標簽數組
           List<Element> propElements = bean.elements();
           // 8. 調用 propElements 方法, 獲取子標簽數組
           for (Element prop : propElements) {
               // 9. 調用 attributeValue 方法, 傳入屬性名稱, 獲取對應的屬性值
               String name = prop.attributeValue("name");
               String value = prop.attributeValue("value");
               System.out.println(name + " = " + value);
          }
      }
  }

輸出結果 :
001 = cn.itcast.bean.User
username = ZhangSan
password = 123456
002 = cn.itcast.bean.User
username = LiSi
password = 654321

15.3  正則表達式

        15.3.1 正則概念
            egular Expression 正則表達式 : 在Java中, 正則主要使用在 String 類的方法參數為 regex 的名稱上
            
 String 類的三個帶 regex 參數的方法 :
split(String regex) 切割.
matches(String regex) 匹配.
replaceAll(String regex, String replacement) 替換.

        15.3.2 符號介紹
1. [] 取值的範圍. 0-9 數值0到9都成立.
        說明 : [0-9] 可以使用 \\d 表示
2. {} 表示前一個條件中 `值 / 字元` 可以出現的次數.
 說明 : {4,11} 至少4次, 最多11次.
    {0,1} 至少0次,最多一次. 可以使用 ? 表示.
    {1,} 至少1次,最多無限次 可以使用 + 表示.
    {0,} 至少0次,最多無限次. 可以使用 * 表示.
3. () 表示分組. 在replaceAll方法的第二個參數上可以使用 $ 符號來引用之前的分組,分組編號自動從1開始.

         15.3.3 案例
                    
public class ReplaceAllTest4 {
   public static void main(String[] args) {

       // 13311111946 -> 133****1946

       String phone = "13311111946";

       /*
          源數據 : 13311111946
          第一部分 : 133     規則一 : 1[34578]\\d
          第二部分 : 1111     規則二 : \\d{4}
          第三部分 : 1946     規則三 : \\d{4}
        */

       String result = phone.replaceAll("(1[34578]\\d)(\\d{4})(\\d{4})", "$1****$3");
       System.out.println("result = " + result);
  }
}

輸出結果 :
result = 133****1946


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄: 一、while迴圈語句 二、for迴圈語句 三、range() 四、break語句 五、continue語句 六、課時09課後習題及答案 ********************* 一、while迴圈語句 ********************* Python的while迴圈跟if條件分支 ...
  • 本文內容: 註解Annotation的介紹 基本註解的用法 首發日期:2018-07-28 註解Annotation的介紹 Annotation是代碼中的特殊標記,能夠在編譯、類載入、運行時被識別(需要設置),並根據不同的Annotation來執行不同的處理。 Annotation可以修飾包、類、構... ...
  • 1. 學習計劃 1、solr集群搭建 2、使用solrj管理solr集群 3、把搜索功能切換到集群版 4、添加商品同步索引庫。 a) Activemq b) 發送消息 c) 接收消息 2. 什麼是SolrCloud SolrCloud(solr 雲)是Solr提供的分散式搜索方案,當你需要大規模,容 ...
  • 一、屬性(特性) 普通方法去執行的時候,後面需要加括弧,特性方法執行的時候和靜態欄位一樣不需要不需要加括弧. 特性方法不和欄位同名. 特性方法不能傳參數. 獲取特性 設置特性 設置特性方法的時候,所需要加的裝飾器名字規則是,你所設置特性方法名字點setter(例如:@end.setter) 這個特性 ...
  • 運行結果: ...
  • 最近在面試過程中,遇到許多抽象類和介面的面試題,所以今天特意研究了下,然後寫出來分享給大家,希望對面試的朋友有幫助,如果覺得寫的可以點個贊吧! 1:抽象類可以實例化,抽象類可以通過子類間接的實例化父類,介面不能實例化。 2:抽象類可以擁有私有屬性、方法,介面不能擁有。 3:抽象類方法不能使用defa ...
  • C++11新特性: auto: auto讓編譯器通過初始值來推算變數的類型。 auto定義的變數必須有初始值。 auto聲明的所有變數的初始基本數據類型都必須一樣。 decltype: decltype的作用是選擇返回操作數的數據類型。 編譯器分析表達式並得到它的類型,卻不計算表達式的值。 如果de ...
  • Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the leng ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...