我目前正在一个项目中使用Seasar2 Framework。该框架在日本很受欢迎,但我在查找英文文档时遇到了问题。即使在他们的官方英文翻译网站上,他们也只是讨论该框架使用依赖注入和AOP。
我对他们在S2Dao组件中使用它的方式很感兴趣。基本上,您只需要自动创建接口DAO类和框架,在运行时更改代码,并创建中间类,该中间类在在中间被调用。因此,DB事务代码会自动添加到类中。我想知道,有没有关于如何做到这一点的逐步解释?java能在运行时更改代码,在运行时改变方法吗?
关于如何做到这一点,有很好的参考资料吗?我只是想知道这个框架是如何做到这一点的。
是的,可以在运行时动态实现接口,也可以操作编译后的字节码。
Java提供了一种在运行时实现接口的内置机制,称为动态代理类。
还有像cglib或javassist这样的好库,它们不仅允许您实现接口,还允许您扩展类和在运行时操作字节码(例如,更改方法的行为)。像Spring和Hibernate这样的框架使用这样的库来实现它们的魔力,所以您的框架可能也在使用其中的一些库。
注意:如果您很好奇,这些库可以"调整"字节码,因为它们不使用JVM的默认ClassLoader,而是使用自己的ClassLoader加载类,因此它们可以完全控制加载类的每个字节,并且可以对它们执行任何操作:)。