如何使用 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 容器就不会启动。 ;-)