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