Создание динамического класса - Java
Есть ли способ динамически создать класс, имеющий строку, содержащую код класса, или, возможно, добавить метод таким же образом в существующий класс, ранее созданный?
Сценарий варианта использования: учащийся сдает экзамен, на котором ему нужно написать несколько методов без IDE (поэтому он представляет простую строку). То, чего я хочу добиться, - это способ выполнить простой модульный тест по его представлению. Например, кликабельная кнопка для запуска модульного теста, предоставленная профессором.
Извините за мой плохой английский и заранее спасибо!
2 ответа
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).
Если у вас есть экземпляр, вы можете передать его в свое приложение для тестирования, чтобы запустить несколько тестов и получить результаты.
Было бы проще, чтобы представленный класс реализовывал интерфейс, который вы определили, и протестировал тестовый код на этом интерфейсе. Таким образом, ваш тест будет скомпилирован заранее и все еще может обрабатывать динамически скомпилированную и инстанцированную отправку во время выполнения.