动态类创建 - Java

时间:2016-06-22 08:21:52

标签: java dynamic reflection classloader reloading

有没有办法动态创建一个包含类代码的字符串的类,或者可能以同样的方式向以前创建的现有类添加方法?

用例场景:学生正在进行考试,他必须在没有IDE的情况下编写一些方法(因此他提交了一个简单的字符串)。我想要实现的是一种在他的提交上执行简单单元测试的方法。例如,一个可点击的按钮,用于运行由教授提供的单元测试。

抱歉我的英文不好,并提前致谢!

2 个答案:

答案 0 :(得分:0)

KIT(德国卡尔斯鲁厄的一所大学)创建了一个测试学生编程任务的工具。你看看它here

答案 1 :(得分:0)

学生将提交Java源代码,而不是字节代码。 Java源代码必须使用Java编译器编译为字节代码,然后才能由类加载器加载。您可以通过以编程方式调用编译器来完成此操作(请参阅this answer)。在运行时加载这个新.class文件的字节代码可以这样做:

class NetworkClassLoader extends ClassLoader {
     String host;
     int port;

     public Class findClass(String name) {
         byte[] b = loadClassData(name);
         return defineClass(name, b, 0, b.length);
     }

     private byte[] loadClassData(String name) {
         // load the class data from the connection
          . . .
     }
 }

(来自here的例子,谢谢@Robert)。

有了实例后,您可以将其提供给测试应用程序以运行某些测试并获得结果。

最简单的方法是让提交的类实现您定义的接口,并让测试代码针对该接口进行测试。通过这种方式,您的测试将预先编译,并仍然可以处理动态编译的&在运行时实例化提交。