什么时候我们需要修改java字节码

spring,hibernate都有用到cglib, javassist来修改java字节码

但是我不是很清楚为什么要这样做?以及他们是怎么做到的

是在运行时还是编译时修改的?他们怎么确保修改后的语义是正确的呢

javassist没有用过,说说cglib
在AOP中,Java原生自带的模式需要依赖于接口,
但是一些实现里面,是通过继承来实现的,压根就没有接口,或者只有很底层的接口。
这种场景下,就没办法通过接口的这种动态代理方式来实现动作拦截。
所以只好依赖于cglib。
当然,最优雅的还是通过接口的方式,cglib只不过是无奈的选择罢了。
另外,cglib是运行时动态修改字节码的。