我一直在用AspectJ (ajc)正确编织这个项目。情况如下:
我正在使用一个名为DaCapo benchmark的基准库,在其中我试图拦截对Iterator.HasNext()和Next()[学术研究]的所有调用。这似乎是在真空中工作,但是DaCapo的工作方式是这样的,它自己的jar包含其他jar,它根据我想要运行的基准与它的依赖项一起提取并运行它。
我想拦截所有具有相同方面的HasNext()s和Next()s,以便在所有jar文件中跟踪总数,而不是在每个单独的文件中。
我希望我说得足够清楚。为了能帮助我解决这个奇怪的问题,我完全可以回答你的任何问题。
注:我有一种奇怪的感觉,它实际上是不可行的,但是在eclipse中使用AJDT进行的测试(我使用ajc的原始aspectj进行DaCapo基准编织)暗示了这种可能性。
我知道现在太晚了,但也许能帮助到别人。
我从你的问题中理解的是你想在多个jar中波浪相同的方面。
所以有两种方法
- 如果你使用的是eclipse:
然后创建aspect项目并进入其属性>在左侧面板单击aspect构建选项>在右侧面板选择inpath选项卡>现在单击添加外部jar>添加您想要wave aspect的jar>单击OK
再次进入其属性>单击左侧面板的aspect构建选项>选择右侧面板的Output jar选项卡>并给出您想要创建的新jar的名称。>单击ok。
创建和编写方面并构建或清理项目。它会在项目的根目录下生成你在"output jar"中指定的jar文件,这个jar文件将包含你在inpath jars中指定的所有jar文件。就这样了。
-
如果你正在使用propmt命令,那么:
编写你想拦截的方法的方面。>现在在命令提示符下执行以下命令:
ajc -inpath myjar .jar -inpath myjar .jar myAspect.java -outjar MyOutputJar.jar
就是它,它将生成最终的jar与所有你在inpath中提到的jar。您可以使用任意多的-inpath来将代码放入任意多的jar文件中。对于任何依赖错误,在类路径中给出所需的依赖jar。
如果您正在使用加载时编织,那么这是不可能的。这是一个循环问题。你需要编织JDK,但是编织器需要JDK自己加载,所以JDK的许多部分不能使用LTW编织。
因此,您需要使用编译时编织。像这样可以工作:
ajc -inpath rt.jar -outjar woven_rt.jar *.aj
我不确定这是否是您遇到的问题,但它可能会解决问题。