Нет. Каждый загрузчик классов имеет загрузчик классов начальной загрузки в качестве предка, и попытка загрузить класс, который уже определен в загрузчике классов, просто приведет к использованию версии предка. Это сделано для предотвращения переопределения java.lang.Object
и других встроенных функций.
Из Javadoc для ClassLoader
:
Класс ClassLoader
использует модель делегирования для поиска классов и ресурсов. Каждый экземпляр ClassLoader
имеет связанный родительский загрузчик классов. Когда запрашивается поиск класса или ресурса, экземпляр ClassLoader
делегирует поиск класса или ресурса своему загрузчику родительского класса, прежде чем пытаться найти сам класс или ресурс. Встроенная виртуальная машина Загрузчик классов, называемый загрузчиком классов начальной загрузки, сам по себе не имеет родителя, но может служить родителем экземпляра ClassLoader
.
Вы можете определить пользовательский загрузчик классов, который предоставляет defineClass
, без вызова findClass
и избежать делегирования, которое происходит в findClass
, но я бы не стал полагать, что defineClass(className, bytes)
работает так, как задумано для всех JVM, когда существует parent.findClass(className)
.