2

当我阅读 JDK 6.0 的源代码时,我在 ArrayList 中找到了这两个方法。你看他们都是私人的。但是经过搜索,我没有找到任何其他调用它们的方法。我也考虑了本地方法,但仍然找不到。这两个方法似乎是处理 IO 的,但它们从来没有被调用过。

所以,我的问题是,它们是如何工作的?还有其他方法可以调用私有方法吗?

/**
 * 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;
4

1 回答 1

3

这两种方法在可序列化类中用于自定义序列化(也称为自定义默认协议)

文章中的文字:

然而,有一个奇怪而狡猾的解决方案。通过使用序列化机制的内置特性,开发人员可以通过在其类文件中提供两种方法来增强正常流程。这些方法是:

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

请注意,这两个方法都(并且必须)声明为私有,证明这两个方法都没有被继承、覆盖或重载。这里的技巧是虚拟机会自动检查是否在相应的方法调用期间声明了任一方法。虚拟机可以随时调用您的类的私有方法,但没有其他对象可以。

于 2012-08-30T03:00:18.487 回答