AspectJ&控制其他罐子里的电话

时间:2012-08-24 07:13:08

标签: aspectj

POST 1:理论问题

我们使用一些软件,实际上是一个带有自己的Tomcat和shell脚本的Web模块来控制它。它还有一个插件系统,允许您上传具有特定结构的.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。它应该在那里,或者如何配置虚拟机来拥有它?

1 个答案:

答案 0 :(得分:1)

是的,为什么不呢?如果您可以扩展您的问题并解释(可能通过示例)系统中有哪些参与者和行动,我们可能能够以更加坦诚的方式帮助您。但基本上我没有看到任何问题。可以动态加载JAR模块,但是如果您知道要拦截的Tomcat应用程序中的哪些调用,则可以通过重新编织现有类来静态地对其进行静态检测,或者在JVM启动期间通过LTW(加载时编织)动态地对其进行检测。 。没有必要触摸您上传的JAR模块,据我了解,您希望避免这些模块。

您可能希望通过

编织主应用程序的目标类
  • execution(<methodsToBeChecked>)切入点与
  • 结合使用
  • around()建议。

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

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

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