자바
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
메소드는 객체가 직렬화 해제 될 때 호출되지만 직접 코드가 아니거나 내 코드가 아닌 직렬화 해제 라이브러리에 의해 호출되지는 않습니다. 소스를 자세히 살펴보면 낮은 수준에서 메서드가 내부적으로 리플렉션을 통해 호출된다는 것을 알 수 있습니다.