1

我想从用户输入收集的外部位置实例化一个新的类对象。程序询问用户文件在哪里,比如 /tmp/MyTestClass.java。然后我希望它抓取该 .java 文件并使其成为程序中的可用类。所以我可以调用类似 MyClass = new MyTestclass() 的东西。我一直在环顾四周,似乎找不到答案,或者甚至可能找不到答案?任何信息都会很有用。

谢谢!!

- - - - - -编辑 - - - - - - - -

我可能一直在思考我的问题。这是针对 JUnit 测试的(抱歉之前应该提到过)。下面是我用来拉入静态类的示例。我希望能够从用户输入中动态提取 JUnit 测试文件。testcastjunit 是类的名称。我需要能够以编程方式从用户输入中获取类并运行测试用例。

org.junit.runner.Result result = JUnitCore.runClasses(**testcastjunit.class**);
            for (Failure failure : result.getFailures()) {
                System.out.println(failure.toString());
            }
4

2 回答 2

4

如果我理解你,这就是你需要的:

JavaCompiler jCompiler = ToolProvider.getSystemJavaCompiler();
List<String> options = Arrays.asList(
                           "-d", "./bin/",
                           path+".java");
int compilationResult = jCompiler.run(null, null, null, 
                options.toArray(new String[options.size()]));
if (compilationResult == 0) {
    mensaje = "Compiled the "+path+" to its .class";
    ClassLoader cLoader = ClassLoader.getSystemClassLoader();
    try {
        cLoader.loadClass("THE CLASS");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
} else {
    mensaje = "Couldnt compile.";
}

这对你有用:

  1. 它让java编译器编译一个类。
  2. 创建选项,-d 是编译后要放置 .class 的任何位置,第二个是 .java 文件的路径。
  3. 编译,如果编译成功,它会加载类。
  4. 开始使用您的课程!
于 2012-10-25T19:15:11.447 回答
1

感谢 Javier 的建议,我能够让我的程序动态编译和运行 JUnit 测试用例。我正在使用它来运行 Selenium IDE 导出的 .java 文件。下面是我完成的例子。希望这可以帮助其他寻找类似解决方案的人。另一个说明我正在使用 Eclipse IDE 进行开发,快乐编码!

    //the loc and name variables are gathered from user input
    String fileloc = loc +"/"+ name + ".java";
    JavaCompiler jCompiler = ToolProvider.getSystemJavaCompiler();
    List<String> options = Arrays.asList("-d", "./bin/",fileloc);

    int compilationResult = jCompiler.run(null, null, null, 
            options.toArray(new String[options.size()]));
    if (compilationResult == 0){
        //This is the package name exported from selenium IDE exported files
        File file = new File("./bin/com/example/tests/" + name);
        URL url = null;
        try {
            url = file.toURL();
            URL[] urls = {url};
            ClassLoader cl = new URLClassLoader(urls);
            org.junit.runner.Result result = JUnitCore.runClasses(cl.loadClass
                    ("com.example.tests." + name));
            for (Failure failure : result.getFailures()) {
                System.out.println(failure.toString());
            };
        } catch (MalformedURLException e) {
            System.out.println("Error with file location (URL)");
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            System.out.println("Couldn't Not Find Test Class To Load");
            e.printStackTrace();
        }
    }else{
        System.out.println("Could not Find Java Source File Located in `" + fileloc + "`");
        System.exit(1);
    }
}
于 2012-10-29T16:13:33.740 回答