Загрузчик класса контекста потока немного взломан.
Когда вы загружаете класс с отражением, вы используете либо явный загрузчик класса, либо тот, который непосредственно вызвал класс.Когда вы ссылаетесь на класс, используя обычный код Java, в качестве источника для загрузчика используется класс, запрашивающий связывание.
Thread.setContextClassLoader
используется для установки загрузчика класса на Thread.getContextClassLoader
.Это используется случайными API (в частности, через ServiceLoader
), чтобы выбрать классы с помощью отражения, чтобы вы могли изменить реализацию.Плохая идея - когда реализации меняются из-за кода, в зависимости от того, в каком потоке он работает в критический момент.