The trick is that we use the same original object at the same address in memory and overwrite what class it thinks it is (as opposed to wrapping it). So in a way it becomes a proxy to itself.
I see, I thought you were using the proxy as normal and had programmatically made new classes also. But you are creating an object and then setting its class to the proxy. Neat.