POST 1:理论问题
我们使用一些软件,实际上是一个Web模块,它有自己的Tomcat和shell脚本来控制它。它还有一个插件系统,允许您上传具有特定结构的.jar文件,为应用程序添加新功能。
问题:我想控制&实际更改对主系统/应用程序中不同调用的响应(不在我的jar中)。我可以使用AspectJ来做这件事吗?为什么?除了更改主应用程序的代码之外,其他的一般可能性是什么。
POST 2:尝试
我试着这样做(在Eclipse中):
- 在AspectJ项目中,我添加了jar文件,即要编织的类所在的位置(实际上我将其添加到了INPATH中)
- 将项目导出为"支持AspectJ的Jar"
- 部署了在步骤2中导出的jar文件:没有结果
问题:
-
在导出的方面jar中,只有AspectJ项目的.class文件,没有INPATHjar的.class文件。从导入的INPATH jar中是否应该有其他类?
-
在导出的方面jar中,没有带有aspectj运行时(aspectj-rt.jar)的jar。它应该在那里吗?或者如何配置虚拟机来拥有它?
是的,为什么不呢?如果你能扩展你的问题并解释(也许用一个例子)系统中有哪些参与者和行动,我们可能会以更具体的方式帮助你。但基本上我认为没有问题。JAR模块可能是动态加载的,但如果您知道要拦截Tomcat应用程序中的哪些调用,则可以通过重新编织现有类或在JVM启动期间通过LTW(加载时编织)动态地对它们进行静态插入。没有必要触摸您上传的JAR模块,正如我所理解的,这是您想要避免的。
您可能希望通过编织主应用程序的目标类
execution(<methodsToBeChecked>)
切入点与around()
建议
其他细节取决于您的具体用例、包、类和方法名称、参数等。around
建议可以做以下一件或几件事:
- 确定呼叫者
- 检查调用参数
- 操纵调用参数
- 使用原始或更改的参数调用原始目标
- 或者根本不执行原始呼叫
- 将原始呼叫的结果传递回呼叫者
- 将所述结果的经操纵版本传回所述调用方
- 将具有正确返回类型的任何合成值传递给调用者
- 捕获由原始调用引发的异常
- 抛出自己的异常
- 等等
你的幻想(以及AspectJ的一些限制)就是极限。:-)