2011-07-19 88 views
1

我在我的代碼中創建了一個對象的克隆。代碼生成和反射

Class<?> oc = o.getClass(); 
Object preStateInstance = oc.newInstance(); 

現在我必須輸出一個Java文件,我希望創建的文件具有該克隆實例的分配。例如:

Object varX = preStateInstance.value; 

這可能嗎?怎麼樣?

我想要做的是創建測試用例。我想將測試中的對象的實例保存爲預置狀態值,以便能夠比較對象的前後狀態。我已經在我的代碼中完成了它,現在我需要將它輸出到JUnit文件中。在處理JUnit文件寫入的類上,我只能訪問preStateInstance

編輯:我覺得我還沒有讓自己清楚。我的JUnit編寫器要求我傳遞一個字符串,以便將其輸出到完整的JUnit文件。克隆實例後,我將不得不告訴我的作者如何在它的文件中初始化它。

+0

我相信這是可能的,但我不明白你想要做什麼。你給的行可以編譯。順便說一句:創建相同類型的新實例不克隆恕我直言。 –

+0

你能添加更多的代碼嗎?解釋一下更好嗎? BTW類#newInstance創建新的實例,而不是對象的空白。 – zacheusz

+0

我曾經相信'newInstance'會創建一個克隆,有沒有辦法做到這一點? –

回答

1

要創建一個克隆,您必須實現Cloneable Interface和一個創建新對象並複製必要屬性的克隆方法。但是,對於你的單元測試,我會推薦某種序列化,看看XStream(http://x-stream.github.io/)它將一個對象轉換爲XML,反之亦然,甚至可以編輯它們之間的XML - 完美無缺對於測試用例恕我直言。

+0

Xstream的+1。最簡單的API之一,非常強大!我用它來達到這種目的。 – Guillaume

0

(公共)類的成員可以使用反射來訪問,也:

Field field = oc.getField("value"); 
Object varX = field.get(preStateInstance); 

但要注意這些事情:

  1. Class.newInstance()不創建的o克隆。它創建一個o的新實例。
  2. Class.newInstance()調用默認構造函數。要確保它是可用
  3. 您不能訪問像
+0

如果你需要私人領域,你可以使用'oc.getDeclaredField()'和'Field.setAccessible(true)' –

+0

@Sean:True。我不想走那麼遠,因爲我擔心我有點吠叫錯了樹,考慮到這個問題也是關於克隆... –

+0

是的,我已經更深入地觀察並設法改進克隆世代。 –

0

保護或低能見度字段如果您需要克隆一個Java對象,您可以使用內置的clone()法(你的類必須實現Cloneable )。或者使用各種Bean屬性庫之一(例如commons/beanutils)將狀態從一個對象轉移到另一個對象。

+0

事情是我無法在我正在生成測試用例的類上實現'Cloneable'。 –