ชวา
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
วิธีการจะเรียกเมื่อวัตถุถูก deserialized แต่มันไม่ได้เรียกว่าโดยตรง - ไม่ได้โดยรหัสของฉันหรือโดยห้องสมุด deserialization หากคุณขุดลึกลงไปในแหล่งที่มาคุณจะเห็นว่าในระดับต่ำวิธีการที่เรียกว่าภายในผ่านการสะท้อนกลับ