AspectJ 和控制其他 jar 中的调用



POST 1:理论问题

我们使用一些软件,实际上是一个Web模块,它有自己的Tomcat和shell脚本来控制它。它还有一个插件系统,允许您上传具有特定结构的.jar文件,为应用程序添加新功能。

问题:我想控制&实际更改对主系统/应用程序中不同调用的响应(不在我的jar中)。我可以使用AspectJ来做这件事吗?为什么?除了更改主应用程序的代码之外,其他的一般可能性是什么。


POST 2:尝试

我试着这样做(在Eclipse中):

  • 在AspectJ项目中,我添加了jar文件,即要编织的类所在的位置(实际上我将其添加到了INPATH中)
  • 将项目导出为"支持AspectJ的Jar"
  • 部署了在步骤2中导出的jar文件:没有结果

问题:

  1. 在导出的方面jar中,只有AspectJ项目的.class文件,没有INPATHjar的.class文件。从导入的INPATH jar中是否应该有其他类?

  2. 在导出的方面jar中,没有带有aspectj运行时(aspectj-rt.jar)的jar。它应该在那里吗?或者如何配置虚拟机来拥有它?

是的,为什么不呢?如果你能扩展你的问题并解释(也许用一个例子)系统中有哪些参与者和行动,我们可能会以更具体的方式帮助你。但基本上我认为没有问题。JAR模块可能是动态加载的,但如果您知道要拦截Tomcat应用程序中的哪些调用,则可以通过重新编织现有类或在JVM启动期间通过LTW(加载时编织)动态地对它们进行静态插入。没有必要触摸您上传的JAR模块,正如我所理解的,这是您想要避免的。

您可能希望通过编织主应用程序的目标类

  • execution(<methodsToBeChecked>)切入点与
  • around()建议

其他细节取决于您的具体用例、包、类和方法名称、参数等。around建议可以做以下一件或几件事:

  • 确定呼叫者
  • 检查调用参数
  • 操纵调用参数
  • 使用原始或更改的参数调用原始目标
  • 或者根本不执行原始呼叫
  • 将原始呼叫的结果传递回呼叫者
  • 将所述结果的经操纵版本传回所述调用方
  • 将具有正确返回类型的任何合成值传递给调用者
  • 捕获由原始调用引发的异常
  • 抛出自己的异常
  • 等等

你的幻想(以及AspectJ的一些限制)就是极限。:-)

最新更新