好的,我有一些时间来找出你没有亲自告诉我的事情。我的假设是正确的,JADE 是第三方库。
这意味着您希望将方面代码编织到包含在该库中的main 方法中。通常在编译时编织时,只会在编译期间编织您自己项目中的类,这就解释了为什么不拦截外部 main 方法。
那么,如何将方面代码编入 JADE 的 main 方法中呢?有两种方式:
编译时二进制编织:您将库放在编译器的 inpath 上,导致它吐出它在库中找到的所有 Java 类的编织版本。这些可以重新打包到一个检测库 JAR 中,然后在您的应用程序中使用。但这也不是很灵活,也很麻烦。
Load-time weaving (LTW):您将-javaagent:/path/to/aspectjweaver.jar 放在JVM 命令行上,并指定一个aop.xml(或aop-ajc.xml)文件告诉编织器将哪些方面编织到哪些包或类中,从而导致 AspectJ 在类加载期间动态应用方面。这是灵活且微创的。
示例:
假设您使用 Eclipse 实现您想要的最简单的方法是创建两个项目,
- 一个包含你的切面和
的 AspectJ 项目
- 一个包含您的 JADE 代理的普通 Java 项目。
看起来像这样:
假玉特工:
package de.scrum_master.app;
import jade.core.Agent;
public class BookBuyerAgent extends Agent {
protected void setup() {
System.out.println("Hello! Buyer-agent " + getAID().getName() + " is ready.");
}
}
方面:
package de.scrum_master.aspect;
public aspect MainAspect {
before() : execution(public static void main(..)) {
System.out.println(thisJoinPoint);
}
}
LTW 配置META_INF/aop-ajc.xml:
在您创建 LTW 运行配置后,该文件将自动生成(见下文)。
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<aspects>
<aspect name="de.scrum_master.aspect.MainAspect"/>
</aspects>
</aspectj>
AspectJ LTW 运行配置:
现在选择您的 Java 项目(不是 AspectJ 项目)并为其创建运行配置:从 Eclipse 菜单中选择“运行”-“运行配置”,然后选择类别“AspectJ Load-时间编织应用程序”,然后单击“新启动配置”按钮。然后指定以下信息:
1.) 项目名称(应预先选择)和主类
2.) JADE 程序参数
3.) 使用“添加项目”按钮将 AspectJ 项目添加到所谓的 aspectpath
控制台输出应如下所示:
execution(void jade.Boot.main(String[]))
Mrz 15, 2015 5:36:18 PM jade.core.Runtime beginContainer
Information: ----------------------------------
This is JADE 4.3.3 - revision 6726 of 2014/12/09 09:33:02
downloaded in Open Source, under LGPL restrictions,
at http://jade.tilab.com/
----------------------------------------
(...)
Hello! Buyer-agent buyer@192.168.178.33:1099/JADE is ready.
Mrz 15, 2015 5:36:19 PM jade.core.AgentContainerImpl joinPlatform
(...)
第一行显示main 方法实际上被AspectJ 拦截了。话虽如此,我真的很想知道为什么要检查它是否被调用,因为如果不是,JADE 容器无论如何都不会启动。 ;-)