gpt4 book ai didi

java - 运行时的切面编织

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:05:01 27 4
gpt4 key购买 nike

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

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

最佳答案

需要考虑的几件事:

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

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

  • 将您的方面编译到您的代码中或使用 LTW,这并不重要。只需确保在实际使用类之前编写方面代码即可。编译时间显然足够快,加载时间勉强够快,但没问题。
  • 使用if() pointcuts对于所有相关的建议,并提供一种方法来动态更改切入点使用的变量的值,以便能够动态地打开和关闭建议。性能开销通常很小,不用担心。在您说它太贵之前先试一试。

此解决方案满足您的条件,即它可以动态激活(停用)并且在编织方面代码后无需重新启动 JVM。

关于java - 运行时的切面编织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17323500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com