动态类创建-Java

动态类创建-Java,java,dynamic,reflection,classloader,reloading,Java,Dynamic,Reflection,Classloader,Reloading,是否有一种方法可以动态创建一个包含类代码的字符串的类,或者可以以相同的方式向先前创建的现有类添加一个方法 用例场景:一个学生正在做一个考试,他必须在没有IDE的情况下编写一些方法(所以他提交了一个简单的字符串)。我想要实现的是一种对他的提交执行简单单元测试的方法。例如,教授提供了一个可点击的按钮来运行单元测试 对不起,我的英语不好,提前谢谢你 KIT(德国卡尔斯鲁厄的一所大学)创建了一个工具来测试学生的编程任务。请看一下,学生将提交Java源代码,而不是字节代码。Java源代码必须使用Java编

是否有一种方法可以动态创建一个包含类代码的字符串的类,或者可以以相同的方式向先前创建的现有类添加一个方法

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


对不起,我的英语不好,提前谢谢你

KIT(德国卡尔斯鲁厄的一所大学)创建了一个工具来测试学生的编程任务。请看一下,学生将提交Java源代码,而不是字节代码。Java源代码必须使用Java编译器编译成字节码,然后才能由类加载器加载。可以通过编程方式调用编译器来实现这一点(请参见答案)。在运行时加载这个新的
.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
          . . .
     }
 }
(示例来自,谢谢@Robert)

一旦你有了一个实例,你就可以把它输入到你的测试应用程序中去运行一些测试并得到结果


让提交的类实现您定义的接口并让您的测试代码针对该接口进行测试是最容易的。这样,您的测试将提前编译,并且仍然可以在运行时处理动态编译和实例化的提交。

那么学生是否会提交一个.txt文件?为什么不是一个.java文件呢?它可以很容易地添加到项目中,因此没有什么奇怪的问题。学生面前有一个文本框,有两个按钮“提交”和“运行测试”。在这个文本框中,他有类代码,他必须通过添加2或3个方法来编辑它。当他点击“运行测试”按钮时,我想象着将所有的类代码放入一个字符串中,这是一种神奇的方法,可以用给定的名称从这个字符串动态创建一个类,从代码中运行junit测试,并将结果返回给他。@TobiasBrösamle“项目”?你指的是哪个项目?OP需要对以文本形式提交的源代码进行某种自动单元测试,而无需IDE。了解如何在运行时创建新类或修改现有类。在示例中可以看到如何将代码添加到现有类文件中,尽管这是出于稍微不同的原因。@Adriaan Koster确切地说,我根本没有项目。在运行时通过标准类加载器和
loadClass
加载动态创建的类不是一个好的解决方案。更好的是自定义类加载器,它直接从字节码数据创建类。我想你是对的,因为新类不会在类路径上。想得不够久-D