Java
package stuff;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
public class SerialCall {
static class Obj implements Serializable {
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
System.out.println("Magic!");
}
}
private static final byte[] data = { -84, -19, 0, 5, 115, 114, 0, 20, 115,
116, 117, 102, 102, 46, 83, 101, 114, 105, 97, 108, 67, 97, 108,
108, 36, 79, 98, 106, 126, -35, -23, -68, 115, -91, -19, -120, 2,
0, 0, 120, 112 };
public static void main(String[] args) throws Exception {
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// ObjectOutputStream out = new ObjectOutputStream(baos);
// out.writeObject(new Obj());
// System.out.println(Arrays.toString(baos.toByteArray()));
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data));
in.readObject();
}
}
Javaシリアル化の特別な機能を利用しています。このreadObject
メソッドは、オブジェクトが逆シリアル化されたときに呼び出されますが、直接呼び出されることはありません-私のコードや逆シリアル化ライブラリによってではありません。ソースを深く掘り下げると、低レベルでメソッドがリフレクションを介して内部的に呼び出されることがわかります。