0

POST 1:理论问题

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

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


POST 2:尝试

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

  • 在 AspectJ 项目中,我添加了要编织的类所在的 jar 文件(实际上我将它添加到了 INPATH)。
  • 将项目导出为“支持 AspectJ 的 Jar”
  • 部署第2步导出的jar文件:没有结果。

问题:

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

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

4

1 回答 1

1

是的,为什么不?如果您可以扩展您的问题并解释(也许有一个例子)系统中有哪些参与者和动作,我们可能能够以更具体的方式帮助您。但基本上我认为没有问题。JAR 模块可能是动态加载的,但如果您知道要拦截 Tomcat 应用程序中的哪些调用,您可以轻松地通过重新编织现有类来静态地检测它们,或者在 JVM 启动期间通过 LTW(加载时编织)动态地检测它们. 无需触摸您上传的 JAR 模块,据我了解,这是您想要避免的。

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

  • execution(<methodsToBeChecked>)切入点结合
  • around()建议。

其他细节取决于您的特定用例、包、类和方法名称、参数等。around建议可以执行以下一项或多项操作:

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

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

于 2012-08-24T13:43:29.153 回答