這種方法的局限性 這種方法有兩個(gè)明顯的局限性。第一個(gè)局限性是它不支持對(duì)象的循環(huán)包含。假如對(duì)象 A 包含對(duì)象 B 的一個(gè)引用,對(duì)象 B 又包含對(duì)象 A 的一個(gè)引用,則這個(gè)工具無(wú)法處理。但是,對(duì)于許多項(xiàng)目而言,這種情況很少出現(xiàn)。
改進(jìn) 最初我建議將這個(gè)工具用于開(kāi)發(fā)時(shí)環(huán)境,而不是運(yùn)行時(shí)環(huán)境。答應(yīng)這個(gè)工具在運(yùn)行時(shí)運(yùn)行很方便,但可能會(huì)占用更多的 CPU 周期。但是,對(duì)象轉(zhuǎn)儲(chǔ)/調(diào)試(toString() 的基本用途)通常是在開(kāi)發(fā)時(shí)進(jìn)行,而在生產(chǎn)環(huán)境中要將其關(guān)閉。在某些情況下,假如某些項(xiàng)目可能將 toString() 用于業(yè)務(wù)邏輯,則在生產(chǎn)環(huán)境中就可能不能關(guān)閉轉(zhuǎn)儲(chǔ)/調(diào)試。我建議您根據(jù)具體項(xiàng)目決定是否將其關(guān)閉。
在開(kāi)發(fā)這個(gè)實(shí)用程序之前,我已經(jīng)想到了這種運(yùn)行時(shí)靈活性。首先,我開(kāi)發(fā)了一個(gè)單獨(dú)的授權(quán)類,客戶端的類用它來(lái)生成 toString()。這個(gè)類利用類似 return ToStringGenerator.generateToString(this) 的一個(gè)方法調(diào)用生成 toString,其中 this 指向客戶端類的當(dāng)前實(shí)例,這條語(yǔ)句放在 toString() 方法實(shí)現(xiàn)中。但這個(gè)方法失敗了,因?yàn)?Reflection API 在運(yùn)行時(shí)無(wú)法獲取私有成員的值。因此這個(gè)類只能用于公用成員,這不是我所希望的。
但后來(lái) Sanscraint 先生指出,假如將這段代碼放在同一個(gè)調(diào)用類的一個(gè)方法中,則同樣的 Reflection API 代碼就可以獲取私有成員的值。因此,我修改了這個(gè)實(shí)用程序以便在運(yùn)行時(shí)使用,另外,即使在目標(biāo)類中新增或減少了任何屬性,您也不必更新或編輯 toString() 方法。
改進(jìn) 最初我用 this 前綴來(lái)訪問(wèn)生成代碼中的成員變量,但 Ye 先生指出,這段代碼也可用于靜態(tài)方法,甚至可用來(lái)輸出靜態(tài)成員。這樣,更新后的代碼現(xiàn)在既可處理類成員,也可處理實(shí)例成員。Ye 先生還指出一個(gè)錯(cuò)誤(在此版本中已修正),這個(gè)錯(cuò)誤導(dǎo)致為無(wú)屬性的類生成毫無(wú)用處的代碼。