0

我一直在用 AspectJ (ajc) 正确编织这个项目时遇到问题。情况如下:

我正在使用一个名为 DaCapo Benchmarks 的基准测试库,在其中我试图拦截对 Iterator.HasNext() 和 Next() [学术研究] 的所有调用。这似乎是在真空中工作的,但是 DaCapo 的工作方式是它自己的 jar 包含其他 jar,它根据我想要运行的基准及其依赖项并运行它来提取这些 jar。

我想拦截所有具有相同方面的 HasNext()s 和 Next()s,以便在所有 jar 文件中而不是在每个单独的 jar 文件中跟踪我的总数。

我希望我的理解足够清楚。我完全可以回答您可能遇到的任何问题,以便能够帮助我解决这个奇怪的问题。

PS 我有一种奇怪的感觉,它实际上并不可行,但是在 eclipse 中使用 AJDT 进行的测试(我使用 raw aspectj 和 ajc 进行 DaCapo Benchmarks 编织)暗示了这种可能性。

4

2 回答 2

1

我知道为时已晚,但可能会帮助其他人。.

无论我从您的问题中了解到什么,您都想在多个罐子中挥动相同的方面。

所以有2种方式

  1. 如果您使用的是 eclipse :

然后创建方面项目并转到其属性>单击左侧面板中的方面构建选项>在右侧面板中选择inpath选项卡>现在单击添加外部罐子>添加您想要将方面加入的罐子>单击确定

再次转到其属性>单击左侧面板中的方面构建选项>选择右侧面板中的输出 jar 选项卡>并为您要创建的新 jar 命名。.>点击确定。

创建和编写您的方面并构建或清理您的项目。它将通过您在“输出 jar”中给出的名称在项目的根目录中生成 jar,并且该 jar 将包含您在 inpath jar 中给出的所有 jar,并带有 aspect waved。. 而已 。.

  1. 如果您使用命令 propmt 然后:

    写下你想要拦截方法的方面。>现在在命令提示符下触发以下命令:

    ajc -inpath myJar1.jar -inpath myJar2.jar myAspect.java -outjar MyOutputJar.jar

就是这样,它将生成最终的 jar,其中包含您在 inpath 中提到的所有 jar。. 您可以使用尽可能多的 -inpath 将代码放入 . 对于任何依赖错误,请在类路径中提供所需的依赖 jar。

于 2014-07-08T11:23:22.977 回答
0

如果您使用的是加载时编织,则不太可能。存在循环问题。您需要编织 JDK,但编织器需要 JDK 自行加载,并且 JDK 的许多部分无法使用 LTW 编织。

因此,您将需要进行编译时编织。像这样的东西会起作用:

ajc -inpath rt.jar -outjar woven_rt.jar *.aj

我不确定这是否是您遇到的问题,但它可能会解决问题。

于 2011-10-01T21:41:38.663 回答