This talk looks at how JVM classes are created, how the JVM loads classes with ClassLoaders and the ways in which classes can be manipulated and generated at runtime. It was run as part of the London Java Community virtual meetup series. The presentation was recorded, and is available at YouTube: https://www.youtube.com/watch?v=_ZF1HDTjSSY
The corresponding GitHub repository is at https://github.com/alblue/jvmulator/
If you want a more polished tool for stepping through real bytecode, use Chris Newlands' JITWatch https://github.com/AdoptOpenJDK/jitwatch