2012-08-30 33 views
2

當我讀取JDK 6.0的源代碼時,我在ArrayList中找到了這兩個方法。你看他們都是私人的。但搜索後,我沒有發現任何其他方法調用其中任何一個。我也考慮過本地方法,但仍找不到任何方法。這兩種方法似乎處理IO,但它們從來沒有被調用過。writeObject和readObject如何工作?

所以,我的問題是,他們是如何工作的?有沒有其他方法可以調用私有方法?

/** 
* Save the state of the <tt>ArrayList</tt> instance to a stream (that is, serialize it). 
*/ 
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException; 

/** 
* Reconstitute the <tt>ArrayList</tt> instance from a stream (that is, deserialize it). 
*/ 
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException; 
+0

您可以隨時嘗試編輯方法來引發異常,然後查看堆棧跟蹤以查看它們的調用方式。 – Antimony

+0

@Matt Ball明白! – blackdog

+0

@MattBall thx!順便說一句,另一個問題。一個本地方法可以調用私有方法嗎? – blackdog

回答

3

這兩種方法在序列化類用於自定義序列化(又名Customize the Default Protocol)

從文章全文:。

有,然而,一個奇怪但狡猾的解決方案通過使用一個內置的 功能的序列化機制,開發者可以通過在其類文件中提供兩種方法來增強正常進程 這些方法是:

  1. private void writeObject(ObjectOutputStream out)throws IOException;
  2. private void readObject(ObjectInputStream in)throws IOException,ClassNotFoundException;

請注意,這兩種方法都(並且必須)聲明爲私有,證明 這兩種方法都不會被繼承,覆蓋或重載。這裏的 技巧是如果在相應的方法調用期間聲明瞭任一方法,虛擬機將自動檢查以查看 。 虛擬機只要 需要但無其他對象可以調用您的類的私有方法。

相關問題