【问题标题】:how capture the main method trace from jade using AspectJ?如何使用 AspectJ 从玉中捕获主要方法跟踪?
【发布时间】:2015-03-10 16:47:59
【问题描述】:

我在eclipse IDE中使用Jade,我想从jade中捕获main方法,因为main方法是每个应用程序的起点,我想测试JADE中间件的运行是否也正确(即:我想检查当我启动玉中间件时是否执行了main方法) 我已经这样做了:

public aspect MainAspect {
  pointcut main() : execution(public static void main(..));

  before() : main(){
      System.out.println("main is executed");
  }
}

但它没有捕获任何东西;有什么意见吗? 谢谢

【问题讨论】:

  • 什么是玉?你可以提供一个链接。我假设它是某种图书馆,对吧​​?但我只是在猜测,在尝试回答问题时猜测并不好。因此,请编辑您的问题,提供更多信息,例如方面应该捕获的一些应用程序代码。理想情况下,提供SSCCE 使问题可重现。
  • JADE : Java Agent 开发框架,我觉得很流行,不用介绍了
  • 首先,流行与否,我不知道。但我对 AspectJ 了解很多。其次,您在此处选择的标签的描述为“受 Haml 严重影响的高性能模板引擎”,因此是我的问题。谷歌也列出了 JADE 的不同主题。第三,您仍然没有提供更多的上下文代码。要聪明,帮助别人帮助你。这是为了你自己最好的,你想从社区中得到一些东西,反之亦然。从我的声誉评分可以看出,我确实愿意提供帮助,但我需要知道如何提供帮助。

标签: pug aspectj agents-jade


【解决方案1】:

好的,我有一些时间来找出你没有亲自告诉我的事情。我的假设是正确的,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 容器无论如何都不会启动。 ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2011-08-06
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多