Для развлечения (и для использования в моем классе в качестве учебного пособия) я пишу программу, похожую на JUnitTests. Я хочу использовать его для запуска тестов кода, написанного старшеклассниками. Когда студент пишет код, который получает пользовательский ввод через System.in с помощью сканера, я хочу «взломать» сканер, чтобы предоставить мои собственные заранее определенные пользовательские входы. У меня все отлично работает, за исключением того, что я хочу, чтобы мой Сканер был внутренним классом Автотестера.
Пример, приведенный ниже, сильно упрощен, но все понятно.
Допустим, студенты пишут этот код:
import java.util.*;
public class Practice {
public static void practiceScanners() {
Scanner console = new Scanner(System.in);
System.out.print("Type first name, age, and address >> ");
String name = console.next();
int age = console.nextInt();
String address = console.nextLine();
System.out.println(name + " is " + age + " and lives at" + address + ".");
}
}
Затем, скажем, у меня есть класс с именем AutoTester, который выглядит примерно так: псевдокод:
public class AutoTester {
public main() {
* use JavaCompiler from ToolProvider to compile Practice.java
* use reflection to invoke Practice.practiceScanners()
* (hopefully) have student code use my Scanner instead of java.util.Scanner
* collect output of running the student code
* compare against expected output
}
//My version of Scanner is an inner class within AutoTester
public class Scanner {
private String script = "Bob 13 42 Maple Drive";
<* implementation not shown *>
}
}
ЕслиЯ перемещаю свою версию Scanner в собственный файл Scanner.java, это работает просто отлично. Код студента использует мой (локальный) сканер, прежде чем искать в java.util. Но когда я перемещаю свой сканер в автотестер как внутренний класс, код студента не знает, где его искать. И я не хочу каким-либо образом редактировать код ученика (например, изменить строку создания экземпляра сканера, чтобы сказать, что новый AutoTester.Scanner (System.in))
Есть ли способ дать мой AutoTester.ScannerПриоритет перед java.util.Scanner при компиляции / запуске программы студента без внесения каких-либо изменений в их код?