一个Agent如何以程序的方式生成另一个Agent

 

可以通过以下方式进行创建:

String name = "Alice" ;

        AgentContainer c = getContainerController();

        try {

            AgentController a = c.createNewAgent( name, "Pong", null );

            a.start();

        }

        catch (Exception e){}

其中,createNewAgent方法的第一个参数是要创建的Agent的名称,第二个是Agent的类名,实际使用时要包括他所在的命名空间(包名),第三个参数是要传入的参数的名称。

例子:

package jadePrime.acl;

/**

 * Program which creates another Agent and sends

     ------------     it some messages

     comm2.java

 *

 */

 

import jade.core.Agent;

import jade.core.behaviours.*;

import jade.core.AID;

import jade.wrapper.AgentContainer;

import jade.wrapper.AgentController;

import jade.lang.acl.*;

public class Comm2 extends Agent {

     String name = "Alice" ;

     AID alice = new AID( name, AID.ISLOCALNAME );

     protected void setup(){

           

            AgentContainer c=getContainerController();

            System.out.println("find container!");

           

            try{

                   AgentController a=c.createNewAgent(name,"jadePrime.acl.Pong",null);

                   a.start();

                   System.out.println("++++pong has created:"+alice);

                  

            }

            catch (Exception e){

                   System.out.println("Create Agent Error!");

                   addBehaviour(new SimpleBehaviour(this){

                          int n=0;

                          public void action()

                           {

                                 ACLMessage msg = new ACLMessage(ACLMessage.INFORM);

                                 msg.setContent("Message #" + n );

                                 msg.addReceiver(alice);

                                 System.out.println("+++ Sending: " + n);

                                 send(msg);

                                 block( 1000 );

                           }

 

                          public boolean done(){return ++n>3;}

                   });

            }

           

     }

}

当我们创建一个Comm2Agent时,在控制台上会打印出创建alice成功的消息。

如何收集当前AMSAgent列表

package jadePrime.manage;

 

import jade.core.Agent;

import jade.core.AID;

 

import jade.domain.AMSService;

import jade.domain.FIPAAgentManagement.*;

 

public class AMSDump extends Agent

{

    protected void setup()

    {

       AMSAgentDescription [] agents = null;

        try {

            SearchConstraints c = new SearchConstraints();

            c.setMaxResults (new Long(-1));

           agents = AMSService.search( this, new AMSAgentDescription (), c );

       }

       catch (Exception e) {

            System.out.println( "Problem searching AMS: " + e );

            e.printStackTrace();

       }

      

       AID myID = getAID();

       for (int i=0; i<agents.length;i++)

       {

           AID agentID = agents[i].getName();

           System.out.println(

               ( agentID.equals( myID ) ? "*** " : "    ")

               + i + ": " + agentID.getName()

           );

       }

       doDelete();

       //System.exit(0);

    }

      

}//end class AMSDump

详见:http://www.iro.umontreal.ca/%7Evaucher/Agents/Jade/primer4.html#5

 

Java Agent 是指在程序运行时,通过 Java Instrumentation API 动态修改字节码的一种技术。Java Agent 可以用于实现一些高级功能,例如监控、代码注入等。下面是一个简单的 Java Agent 的设计和编写demo: 1. 创建一个 Maven 项目,并添加以下依赖: ```xml <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-all</artifactId> <version>5.2</version> </dependency> ``` 2. 创建一个 Java Agent 类,并实现 premain 方法: ```java public class MyAgent { public static void premain(String agentArgs, Instrumentation inst) { // 在这里添加字节码转换器 } } ``` 3. 在 premain 方法中添加字节码转换器: ```java public static void premain(String agentArgs, Instrumentation inst) { inst.addTransformer(new MyClassFileTransformer()); } ``` 4. 创建一个 MyClassFileTransformer 类,并实现 transform 方法,该方法将在类被加载时被调用: ```java public class MyClassFileTransformer implements ClassFileTransformer { public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) { // 在这里修改字节码 return classfileBuffer; } } ``` 5. 在 transform 方法中,可以使用 ASM 库修改字节码。例如,下面的代码将在每个类的构造函数中添加一行输出语句: ```java public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) { ClassReader classReader = new ClassReader(classfileBuffer); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); // 创建一个 ClassVisitor,用于修改字节码 ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM7, classWriter) { @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { MethodVisitor methodVisitor = super.visitMethod(access, name, descriptor, signature, exceptions); if ("<init>".equals(name)) { // 找到构造函数 methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); methodVisitor.visitLdcInsn("Hello, World!"); methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); } return methodVisitor; } }; // 使用 ClassVisitor 修改字节码 classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES); return classWriter.toByteArray(); } ``` 6. 编译项目,并将生成的 jar 文件作为 Java Agent 运行: ```bash java -javaagent:myagent.jar -jar myprogram.jar ``` 以上就是一个简单的 Java Agent 的设计和编写demo。在实际应用中,需要根据具体的需求进行进一步的开发和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值