如何使用 AspectJ 从玉中捕获主要方法跟踪?
how capture the main method trace from jade using AspectJ?
我在eclipse中使用Jade IDE,我想从jade中捕获main方法,因为main方法是每个应用程序的起点,我想测试它是否也适合运行 的 JADE 中间件(即:我想检查 main 方法是否在我启动 jade 中间件时执行)
我已经这样做了:
public aspect MainAspect {
pointcut main() : execution(public static void main(..));
before() : main(){
System.out.println("main is executed");
}
}
但它没有捕捉到任何东西;有什么意见吗?
谢谢
好的,我有一些时间来找出你没有告诉我的事情。我的假设是正确的 JADE 是第三方库。
这意味着您想将方面代码编织到包含在该库中的 main
方法中。通常在编译时编织只有 class 来自你自己的项目的代码在编译期间被编织,这解释了为什么外部 main
方法没有被拦截。
那么如何将方面代码编织到 JADE 的 main
方法中呢?有两种方式:
编译时二进制编织:您将库放在编译器的 inpath 上,导致它吐出所有 Java classes 它在库中找到。这些可以重新打包到一个检测库 JAR 中,然后在您的应用程序中使用。但这也不是很灵活,也很麻烦。
Load-time weaving (LTW):您在 JVM 命令行上放置 -javaagent:/path/to/aspectjweaver.jar
并指定一个 aop.xml(或 aop-ajc.xml) 文件告诉编织器将哪些方面编织到哪些包或 classes 中,导致 AspectJ 在 class 加载期间动态应用方面。这是灵活且微创的。
示例:
假设您使用 Eclipse 实现您想要的最简单方法是创建两个项目,
- 包含您的方面的 AspectJ 项目和
- 包含您的 JADE 代理的普通 Java 项目。
看起来像这样:
虚拟 JADE 代理:
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 运行 配置:
现在select你的Java项目(不是AspectJ项目)并为它创建一个运行配置:Select "Run" - "Run Configurations" 来自 Eclipse 菜单,然后 select 类别 "AspectJ Load-Time Weaving Application" 并单击 "New launch configuration" 按钮。然后指定以下信息:
1.) 项目名称(应该预先selected)和主要class
2.) JADE 程序参数
3.) 使用"Add projects" 按钮将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 容器就不会启动。 ;-)
我在eclipse中使用Jade IDE,我想从jade中捕获main方法,因为main方法是每个应用程序的起点,我想测试它是否也适合运行 的 JADE 中间件(即:我想检查 main 方法是否在我启动 jade 中间件时执行) 我已经这样做了:
public aspect MainAspect {
pointcut main() : execution(public static void main(..));
before() : main(){
System.out.println("main is executed");
}
}
但它没有捕捉到任何东西;有什么意见吗? 谢谢
好的,我有一些时间来找出你没有告诉我的事情。我的假设是正确的 JADE 是第三方库。
这意味着您想将方面代码编织到包含在该库中的 main
方法中。通常在编译时编织只有 class 来自你自己的项目的代码在编译期间被编织,这解释了为什么外部 main
方法没有被拦截。
那么如何将方面代码编织到 JADE 的 main
方法中呢?有两种方式:
编译时二进制编织:您将库放在编译器的 inpath 上,导致它吐出所有 Java classes 它在库中找到。这些可以重新打包到一个检测库 JAR 中,然后在您的应用程序中使用。但这也不是很灵活,也很麻烦。
Load-time weaving (LTW):您在 JVM 命令行上放置
-javaagent:/path/to/aspectjweaver.jar
并指定一个 aop.xml(或 aop-ajc.xml) 文件告诉编织器将哪些方面编织到哪些包或 classes 中,导致 AspectJ 在 class 加载期间动态应用方面。这是灵活且微创的。
示例:
假设您使用 Eclipse 实现您想要的最简单方法是创建两个项目,
- 包含您的方面的 AspectJ 项目和
- 包含您的 JADE 代理的普通 Java 项目。
看起来像这样:
虚拟 JADE 代理:
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 运行 配置:
现在select你的Java项目(不是AspectJ项目)并为它创建一个运行配置:Select "Run" - "Run Configurations" 来自 Eclipse 菜单,然后 select 类别 "AspectJ Load-Time Weaving Application" 并单击 "New launch configuration" 按钮。然后指定以下信息:
1.) 项目名称(应该预先selected)和主要class
2.) JADE 程序参数
3.) 使用"Add projects" 按钮将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 容器就不会启动。 ;-)