首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行时的方面编织

运行时的方面编织
EN

Stack Overflow用户
提问于 2013-06-26 22:52:28
回答 3查看 10.6K关注 0票数 8

我正在寻找一种Java解决方案,它允许我在运行时使用AOP在已经运行的代码之上编织新的代码。关键是不需要重新启动JVM。此外,我希望在运行时删除编织,让旧代码以编织前的方式运行。

我认为AspectJ加载时编织+运行时类加载/卸载可以做到这一点。有人试过吗?有什么建议吗?谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-13 19:54:57

需要考虑的几件事:

  • 没有类卸载的概念,因为要卸载的类需要进行垃圾回收,并且必须不再存在对类的引用。
  • 是这样的,您可以在类加载期间执行LTW,但不能在类加载之后执行。
  • 没有类卸载的概念,因为要卸载的类需要进行垃圾回收,因此不能再存在对类的引用。即使是后者,JVM规范AFAIK也将其声明为可选的,无论是否以及何时卸载,或者GC是否应该清除已经加载的类。你永远不能依赖它。

话虽如此,您既可以尝试OSGi等概念,也可以编写自己的类加载器(或者在互联网上找到许多现有的类加载器),在单独的类加载器实例中加载每个类或每个JAR。这可能会变得非常复杂,所以您可能希望考虑这种简单的方法,只要它在您的情况的技术范围内:

  • 将你的方面编译到你的代码中,或者使用LTW,这都无关紧要。只需确保在实际使用类之前编织了方面代码即可。
  • if() pointcuts用于所有相关的通知,并提供了一种动态更改切入点使用的变量值的方法,以便能够动态地打开和关闭通知。性能开销通常是最小的,不用担心。在你说它太贵之前,先试一试。

这个解决方案满足您的条件,即它可以动态地(取消)激活,并且在编织方面代码后不需要重新启动JVM。

票数 12
EN

Stack Overflow用户

发布于 2014-09-11 13:46:48

Aspect

a aspect是您正在实现的横切功能。它是您正在模块化的应用程序的方面或区域。最常见(尽管简单)的方面示例是日志记录。日志记录是整个应用程序都需要的东西。但是,由于应用程序往往根据功能被分解为多个层,因此通过继承重用日志记录模块

没有任何意义。但是,您可以创建一个日志记录方面,并使用AOP将其应用于整个应用程序。

编织

编织是将方面应用于目标对象以创建新的代理对象的过程。在指定的接合点将方面编织到目标对象中。编织可以在目标类的生命周期中的多个时间点发生:

  • Compile time:在编译目标类时编织方面。这需要一个特殊的compiler.
  • Classload时间:当目标类被加载到JVM中时,方面就会被编织进来。在将类引入application.
  • Runtime之前,这需要一个特殊的ClassLoader来增强目标类的字节码:方面是在应用程序执行期间编织的。通常,AOP容器将动态生成一个代理类,该代理类将在方面中编织时委托给目标类。

(Source)

票数 8
EN

Stack Overflow用户

发布于 2018-12-27 16:10:23

您可以实现一个ASM解决方案,允许在运行时(没有停机)在已经运行的代码上编织新的代码

使用ASM (https://www.baeldung.com/java-asm),

  • 可以重新转换已加载的类。它基本上是读取文件中的类,然后重新转换已加载的类

您可以使用相同的解决方案在运行时删除编织的

  • 加载的类保留在可以重新加载的文件系统上。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17323500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档