Pascal4eg / Java

 Java | Фишки и трюки

Class Loader (загрузчик классов)

public class CustomClassLoader extends ClassLoader {

    @Override
    public Class findClass(String name) throws ClassNotFoundException {
        byte[] b = loadClassFromFile(name);
        return defineClass(name, b, 0, b.length);
    }

    private byte[] loadClassFromFile(String fileName) {
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream(
                fileName.replace('.', File.separatorChar) + ".class");
        byte[] buffer;
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream() ;
        int nextValue = 0;
        try {
            while ( (nextValue = inputStream.read()) != -1 ) {
                byteStream.write(nextValue);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        buffer = byteStream.toByteArray();
        return buffer;
    }
}

В Java, Class Loader (загрузчик классов) является частью Java Runtime Environment (JRE), которая ответственна за загрузку классов в виртуальную машину Java (JVM) во время выполнения программы. Class Loader осуществляет поиск и загрузку классов в память JVM по их именам.

Class Loader имеет иерархическую структуру и состоит из трех основных типов:

  1. Bootstrap Class Loader (Загрузчик базовых классов): Этот загрузчик является частью ядра JVM и отвечает за загрузку системных классов Java, таких как java.lang.Object, java.lang.String и другие. Он является самым высоким в иерархии загрузчиком.
  2. Extension Class Loader (Загрузчик расширений): Этот загрузчик наследуется от Bootstrap Class Loader и загружает классы из расширенной библиотеки Java (расположенной в директории jre/lib/ext).
  3. Application Class Loader (Загрузчик приложений): Также известный как System Class Loader, этот загрузчик загружает классы из путей, указанных в переменной окружения CLASSPATH. Он также загружает классы из текущего рабочего каталога приложения.

Когда Java-программа запускается, система Class Loader следует иерархии загрузки классов. Если класс не найден в одном загрузчике, система пытается найти его в следующем в иерархии.

Процесс загрузки класса включает в себя три этапа:

  1. Загрузка (Loading): Загрузчик находит байт-код класса и загружает его в память.
  2. Связывание (Linking): На этом этапе проводится проверка байт-кода, выделение памяти для статических полей, и разрешение ссылок на другие классы.
  3. Инициализация (Initialization): Выполняются статические блоки кода и инициализируются статические переменные.

Класс ClassLoader предоставляет методы для динамической загрузки классов во время выполнения. Работа с Class Loader'ами может быть полезной, например, при реализации механизмов плагинов и динамической загрузки классов.