我正在寻找一种Java解决方案,它允许我在运行时使用AOP在已经运行的代码之上编写新代码。关键是不要求重启JVM。另外,我想在运行时删除编织,让旧代码以编织前的方式运行。
我认为AspectJ加载时间编织+运行时类加载/卸载会做到这一点。有人试过吗?有什么建议? 谢谢。
答案 0 :(得分:10)
需要考虑的一些事项:
话虽如此,您可以尝试OSGi之类的概念,也可以编写自己的类加载器(或者在Internet上找到许多现有的类加载器之一),它们将每个类或每个JAR加载到单独的类加载器实例中。这可能会变得任意复杂,所以也许你想要考虑这个简单的方法,只要它在你的情况的技术范围内:
if()
pointcuts获取所有相关建议,并提供动态更改切入点使用的变量值的方法,以便能够动态切换建议的开启和关闭。性能开销通常很小,不用担心。在你说它太昂贵之前试一试。此解决方案满足您的条件,即可以(de)动态激活,并且在编制方面代码后不需要重新启动JVM。
答案 1 :(得分:7)
<强>方面强>
一个方面是您正在实施的跨领域功能。 这是您正在模块化的应用程序的方面或区域。一个方面最常见的(尽管很简单)示例是日志记录。记录是整个应用程序所需的。但是,由于应用程序倾向于根据功能分解为多个层,因此通过继承重用日志记录模块
没有意义。但是,您可以使用AOP创建日志记录方面并将其应用于整个应用程序。
<强>织强>
编织是将方面应用于目标对象以创建新的代理对象的过程。 这些方面被编织到指定连接点的目标对象中。编织可以在目标类的生命周期中的几个点进行:
答案 2 :(得分:0)
您可以实施ASM解决方案,该解决方案允许在运行时(没有停机时间)在已经运行的代码之上织入新代码
您可以使用相同的解决方案在运行时除去机织物