org.springframework.core.styler包解讀
這個包的說明是:Support for styling values as Strings, with ToStringCreator as central class.
這個包簡單來說就是提供一個pretty-printing功能的輔助類,而ToStringCreator就是用於產生一個可以輸出經過美化的value資訊的toString()方法。使用方法參照spring的Test可以看到是這樣:
輸出:
如果你接觸過ruby,你應該很熟悉Object.inpsect這個功能,這裡通過ToStringCreator包裝的toString()方法也是產生類似的能夠清晰顯示物件內部結構資訊的方法。spring應該是使用這些輔助類來報告清晰的錯誤資訊或者提示資訊。
看看這個包的UML類圖:
首先,你需要理解ToStringStyler和ValueStyle兩個介面,ToStringStyler定義了描述一個輸入的Value資訊的基本模板方法:
ToStringCreator是ToStringStyler的客戶,它使用ToStringStyler呼叫產生優美格式列印,而ToStringStyler 其實又是使用ValueStyler是訪問每個不同型別的子元素並返回優美格式的String。實現的相當精巧和靈活:
這個包簡單來說就是提供一個pretty-printing功能的輔助類,而ToStringCreator就是用於產生一個可以輸出經過美化的value資訊的toString()方法。使用方法參照spring的Test可以看到是這樣:
int[] integers = new int[] { 0, 1, 2, 3, 4 };
String str = new ToStringCreator(integers).toString();
assertEquals("[@" + ObjectUtils.getIdentityHexString(integers) + " array<integer>[0, 1, 2, 3, 4]]</integer>", str);
或者寫個簡單例子感受下:String str = new ToStringCreator(integers).toString();
assertEquals("[@" + ObjectUtils.getIdentityHexString(integers) + " array<integer>[0, 1, 2, 3, 4]]</integer>", str);
int [] a={1,2,3,4,5,6,7,8,9};
System.out.println(new ToStringCreator(a).toString());
System.out.println(new ToStringCreator(a).toString());
輸出:
[@18558d2 array<Integer>[1, 2, 3, 4, 5, 6, 7, 8, 9]]
如果你接觸過ruby,你應該很熟悉Object.inpsect這個功能,這裡通過ToStringCreator包裝的toString()方法也是產生類似的能夠清晰顯示物件內部結構資訊的方法。spring應該是使用這些輔助類來報告清晰的錯誤資訊或者提示資訊。
看看這個包的UML類圖:
首先,你需要理解ToStringStyler和ValueStyle兩個介面,ToStringStyler定義了描述一個輸入的Value資訊的基本模板方法:
public interface ToStringStyler {
/**
* Style a
* @param buffer the buffer to print to
* @param obj the object to style
*/
void styleStart(StringBuffer buffer, Object obj);
/**
* Style a
* @param buffer the buffer to print to
* @param obj the object to style
*/
void styleEnd(StringBuffer buffer, Object obj);
/**
* Style a field value as a string.
* @param buffer the buffer to print to
* @param fieldName the he name of the field
* @param value the field value
*/
void styleField(StringBuffer buffer, String fieldName, Object value);
/**
* Style the given value.
* @param buffer the buffer to print to
* @param value the field value
*/
void styleValue(StringBuffer buffer, Object value);
/**
* Style the field separator.
* @param buffer buffer to print to
*/
void styleFieldSeparator(StringBuffer buffer);
}
這是典型的Template Method模式,而兩個介面ToStringStyler、ValueStyler和它們的相應實現DefaultToStringStyler、DefaultValueStyler又是策略模式(Strategy)的應用體現。ValueStyler和DefaultValueStyler之間不僅僅是策略模式,同時也是visitor模式,請看DefaultValueStyler中一系列過載的visit方法,這些visit方法訪問不同型別Value的內部結構並構造pretty格式的String返回,提供給ToStringStyler使用。/**
* Style a
toString()
'ed object before its fields are styled.* @param buffer the buffer to print to
* @param obj the object to style
*/
void styleStart(StringBuffer buffer, Object obj);
/**
* Style a
toString()
'ed object after it's fields are styled.* @param buffer the buffer to print to
* @param obj the object to style
*/
void styleEnd(StringBuffer buffer, Object obj);
/**
* Style a field value as a string.
* @param buffer the buffer to print to
* @param fieldName the he name of the field
* @param value the field value
*/
void styleField(StringBuffer buffer, String fieldName, Object value);
/**
* Style the given value.
* @param buffer the buffer to print to
* @param value the field value
*/
void styleValue(StringBuffer buffer, Object value);
/**
* Style the field separator.
* @param buffer buffer to print to
*/
void styleFieldSeparator(StringBuffer buffer);
}
ToStringCreator是ToStringStyler的客戶,它使用ToStringStyler呼叫產生優美格式列印,而ToStringStyler 其實又是使用ValueStyler是訪問每個不同型別的子元素並返回優美格式的String。實現的相當精巧和靈活:
public ToStringCreator(Object obj, ToStringStyler styler) {
Assert.notNull(obj, "The object to be styled is required");
this.object = obj;
this.styler = (styler != null ? styler : DEFAULT_TO_STRING_STYLER);
//開始 this.styler.styleStart(this.buffer, this.object);
}
public ToStringCreator append(String fieldName, byte value) {
return append(fieldName, new Byte(value));
}
一系列不同型別的append方法
public String toString() {
//結束,並返回優美格式的String this.styler.styleEnd(this.buffer, this.object);
return this.buffer.toString();
}
Assert.notNull(obj, "The object to be styled is required");
this.object = obj;
this.styler = (styler != null ? styler : DEFAULT_TO_STRING_STYLER);
//開始 this.styler.styleStart(this.buffer, this.object);
}
public ToStringCreator append(String fieldName, byte value) {
return append(fieldName, new Byte(value));
}
一系列不同型別的append方法
public String toString() {
//結束,並返回優美格式的String this.styler.styleEnd(this.buffer, this.object);
return this.buffer.toString();
}
相關文章
- 【閉包概念】關於閉包概念不同解讀——你可以自己理解。
- Netty解決半包(TCP粘包/拆包導致)讀寫問題NettyTCP
- 關於Flutter iOS安裝包大小的解讀FlutteriOS
- 【舊文新讀】解釋“閉包”需要幾行程式碼?行程
- Laravel 模組開發包 (nWidart/Laravel-modules) 原始碼解讀LaravelDart原始碼
- buffer 原始碼包閱讀原始碼
- DT財經:2016全球創投資料包告解讀創投
- 01揹包、完全揹包、多重揹包詳解
- 粘包拆包及解決方案
- Java 讀取 sun 包的原始碼Java原始碼
- Go如何自動解壓縮包?如何讀取docx/doc檔案內容?Go
- 讀取 jar 包中巢狀的 jar 包內容的方法JAR巢狀
- 第 31 期 flag 包原始碼閱讀原始碼
- 《數讀亞洲美食》大資料包告大資料
- 長沙讀懂區塊鏈錢包!區塊鏈
- 解讀閉包,這次從ECMAScript詞法環境,執行上下文說起
- 真實場景舞臺再現 解讀企業接發包全過程
- 詳解華為錢包
- JavaScript閉包詳解JavaScript
- 閉包詳解一
- 詳解 JavaScript 閉包JavaScript
- Struts jar包詳解JAR
- javascript 閉包詳解JavaScript
- Redux解讀Redux
- 用CCS分析解讀CC3200 SDK工具包的UART示例程式
- 用CCS分析解讀CC3200 SDK工具包的PWM示例程式
- TCP 粘包 - 拆包問題及解決方案TCP
- Java讀取properties配置檔案工具包Java
- Spring Webflux 原始碼閱讀之 accept包SpringWebUX原始碼
- J2ee檔案讀寫包錯
- Docker瞭解(官方解讀)Docker
- Golang Context 包詳解GolangContext
- Javascript—閉包詳解(3)JavaScript
- tcpdump抓包分析詳解TCP
- spring包詳解 (轉)Spring
- tcpdump抓包命令詳解TCP
- 解讀HTTP/3HTTP
- 讀《圖解HTTP》圖解HTTP