Я должен динамически загружать класс с тем же именем из некоторого JAR, но различную реализацию, несколько раз.Можно ли «перезагрузить» загрузчик классов?
Я создаю базу данных оценщика, и мне приходится динамически загружать классы и тестировать их.
Тесты JUnit классы, экземпляры классов, которые должны быть проверены, это простой пример:
package evaluator.tests;
import static org.junit.Assert.*;
import org.junit.*;
import evaluator.tested.*;
public class KTest {
private K tested;
@Before
public void setup() {
tested = new K();
}
@Test
public void returnsTrueTest() {
assertTrue(tested.returnsTrue());
}
}
Остальная часть моего приложения нужно будет получить JAR-файлы от пользователей, которые будут содержать реализации функций K
класс, который тестируется выше. Затем KTest
должны были работать на классахK
, а не в приложениях.
Я знаю, как динамически загружать класс, но я не знаю, как сделать с ним пробную работу, а не то, что я сделал.
Одно из решений, которые я разработал, состояло в том, чтобы изолировать тестирование в совершенно новом классе, например. Evaluation
, создайте новый загрузчик классов в этом классе и загрузите все ссылочные классы. После создания загрузчика классов он загрузит класс K
из файла JAR.
Это будет означать, что каждый раз, когда пользователь отправляет свой JAR, будет создан экземпляр отдельного Evaluation
, он создаст свой собственный загрузчик классов и начнет тест JUnit. Когда это произойдет, тест будет использовать реализацию пользователя K
, , а не по умолчанию.
Возможно ли это, и как это можно сделать?
Я читал, что загрузчики классов всегда спрашивают своих родителей, загружен ли класс. Это означало бы, что мне придется как-то «сбросить» все классы, которые я загрузил динамически из JAR-файла в Evaluation
, чтобы они были выгружены, а затем снова загружены в другой Evaluation
.
нагрузки класс K
, тестовый класс K
, выгрузить класс K
, повторите с различными K
.
И загрузчик классов не "запоминать" классы, загруженных или что? – corazza
см. Wikipedia: загрузчик классов загрузки загружает основные библиотеки Java [5], расположенные в каталоге/jre/lib. Этот загрузчик классов, который является частью основного JVM, написан в собственном коде. –
В основном загрузчик классов bootstrap загружает классы в пакеты java .... Я не думаю, что его можно перезагрузить эти классы, например java.lang.String или java.util.LinkedList –