【问题标题】:Compile and run Jade agents using JavaCompiler and URLClassLoader使用 JavaCompiler 和 URLClassLoader 编译和运行 Jade 代理
【发布时间】:2020-06-29 21:39:42
【问题描述】:

我找不到通过手动调用 JavaCompiler 来执行代理 JADE 类的方法。我正在尝试实现一个模拟器,并添加了一个导入功能,允许人们加载他们的 JADE 代理类,然后我会在模拟器上执行它们以提取数据。

这是导入代码:

            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

            int result = compiler.run(null, null, null, importedClassPath);
            System.out.println("résultat de la compilation Agent JADE : " + result);

            int result2 = compiler.run(null, null, null,
                    "C:\\Users\\Administrateur\\Desktop\\RoboticsWorkspace\\RuntimeProject\\src\\AcompileJadeMain.java");

            System.out.println("résultat de la compilation MAIN : " + result2);

            File classesDir = new File(
                    "C:\\Users\\Administrateur\\Desktop\\RoboticsWorkspace\\RuntimeProject\\bin\\");
            File classesDir2 = new File(
                    "C:\\Users\\Administrateur\\Desktop\\RoboticsWorkspace\\RuntimeProject\\bin\\");

            URLClassLoader classLoader, classloader2;

            try
            {
                // Loading the class
                classLoader = URLClassLoader.newInstance(new URL[] { classesDir.toURI().toURL() });
                classloader2 = URLClassLoader.newInstance(new URL[] { classesDir2.toURI().toURL() });

                Class<?> cls, cls2;

                cls = Class.forName(importedClassname, true, classLoader);
                cls2 = Class.forName("AcompileJadeMain", true, classloader2);

                Object instanceAgent = cls.newInstance();
                Object instanceMainAgent = cls2.newInstance();

                Method call;
                try
                {
                    call = cls2.getMethod("main", String[].class);
                    String[] args = new String[0];
                    call.invoke(null, new Object[] { args });

                } catch (NoSuchMethodException | SecurityException | IllegalArgumentException
                        | InvocationTargetException e1)
                {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

            } catch (MalformedURLException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

这是正在编译的主要内容:

String[] commande = new String[3];
String argument="";
argument = argument+"Robocar:ACompilJade(20,25,7,10,Est,5)";
commande[0]="-cp C:\\Users\\Administrateur\\Documents\\Eclipse_BackupProjects\\jade.jar;"
        +"C:\\Users\\Administrateur\\Desktop\\RoboticsWorkspace\\RuntimeProject\\bin ";
commande[1]="jade.boot -agents ";
commande[2]=argument;
jade.Boot.main(commande);

我尝试同时包含 JADE.rar 的路径和代理类的路径,但仍然可以找到代理类,我收到以下错误:

我还将jade.rar 文件导入到我的项目的构建路径中。

【问题讨论】:

  • 你的 ACompilJade 有包吗?
  • 不,它没有,它有默认的

标签: java agents-jade urlclassloader javacompiler


【解决方案1】:

在我的 Java IDE 中,我通常使用以下行从类文件中启动代理。

bootOptions[n] = "FA:"+Facilitator.class.getCanonicalName();

我不确定您是否可以通过 ACompilJade(20,25,7,10,Est,5)"; 传递参数。但如果可以的话,我很想知道怎么做。

我通常:

  1. 使用属性(20,25,7,10,Est,5) 创建一个子类Robocar1,或者
  2. 一旦启动,将数据发送到该代理。 (我知道这很痛苦,这就是为什么我对更简单的方法感兴趣)。

【讨论】:

  • 您在问如何从子类调用您的代理,我在问如何使用另一个程序中的编译器远程执行它们。但是,像我一样将参数传递给代理很简单:你按照我的方式编写你的 Jade 引导类,然后进入代理类(扩展代理的类,你添加以下内容:Object[] args = getArguments();然后 if (args != null) { 将您需要的参数解析到代理变量中,瞧 } 希望对您有所帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多