Я написал плагин, который вводит список файлов классов (в результате компиляции Java-проекта) и запускает тестовые примеры, связанные с этими классами. Я использую загрузчик классов для загрузки классов и использую JUnitCore() для запуска тестовых примеров. Нижеприведенный код работает нормально, и нет проблем, когда он запускается для классов ввода.ClassLoader загружает предыдущую версию классов - Java
Class<?> clazz = Class.forName(className);
Request request = Request.aClass(clazz);
Result result = new JUnitCore().run(request);
Однако в моей программе приведенный выше код должен быть рассчитан на тысячу раз для подобных классов. Для простоты предположим, что у нас есть только один класс, как первый шаг, скомпилированный классом, а затем, если нет ошибки компилятора , он копируется в каталог bin плагина, а затем моя программа вызывается и проверяет, проходит ли она все тестовые примеры ,
В следующей итерации исходный исходный код изменяется автоматически, а затем компилируется и, если нет ошибки компилятора, копируется и запускается снова в тестовых случаях. Для получения желаемого результата этот процесс можно запустить тысячу раз. [В некоторых случаях даже часы]
Однако проблема заключается в том, что classloader использует первую версию класса компилятора, а на следующей итерации он не загружает новую версию и все еще использует предыдущую. Я обнаружил, что если я добавлю Thread.sleep (1000) до копия инструкция на каждой итерации, то она может найти нужную версию.
Во-первых, почему мне нужна пауза перед копированием и не после копирования? Я ожидаю, что файл не будет завершен во время копирования, прежде чем загрузчик классов захочет загрузить их, а classloader использует предыдущую версию. Однако, как я уже сказал, когда я добавляю паузу перед копией, она отлично работает и использует предыдущую версию, когда я добавляю паузу после копирования.
Во-вторых, использование сна в моей программе - не очень хорошая идея. Мой плагин в лучшем случае может работать в течение нескольких часов, чтобы найти желаемый результат, и если я хочу добавить спать на каждой итерации, то для получения результатов нужно несколько дней. Поэтому я предпочитаю решение без сна. Пожалуйста, дайте мне знать, если кто-нибудь знает, как я могу копировать с указанной проблемой без Thread.sleep.
ClassLoader фактически не использует версию класса «previos», она использует первую версию класса, когда она была загружена в первый раз. Если класс был загружен, он не будет заменен новым. Вам нужно сделать небольшую магию, чтобы загрузить новую версию. И такие вопросы уже заданы, используйте поиск. –
Возможный дубликат [Создать новый ClassLoader для перезагрузки класса] (http://stackoverflow.com/questions/9819318/create-new-classloader-to-reload-class) – Joe
Когда я добавляю спящий режим, он использует правильную версию. – user3601784