bytecode manipulation has been a thing ever since late 90s and early 2000s (e.g. BCEL, Jan, 2001), along with byte code decompilation.
Generally one must understand how bytecode signatures, all flavors of invoke, and constant pool work. After that using visor pattern or 'functional' alike stuff makes no difference whatsoever.
I have used (still using) bytecode manipulation along with custom classloaders as part of my job (albeit not on daily basis any longer). Personally, I don't consider objectweb asm hard to use in any way. and java's class file won't be funnier - perhaps it was the very project I'd not pick bcel, though.