ВСзисы

  • Classloader β€” это ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ JVM, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ классов Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
  • Classloader выполняСт Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, связываниС ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ классов.
  • Π’ Java сущСствуСт иСрархия Classloader: Bootstrap, Extension (Platform), ΠΈ Application (System).
  • ΠšΠ»Π°ΡΡΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ ΠΈΠ· нСстандартных источников с использованиСм кастомного Classloader, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для создания ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… систСм ΠΈΠ»ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ².

Classloader β€” это ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ JVM, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ классов Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ Java ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π³ΠΎ использованиСм, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Classloader выполняСт эту Π·Π°Π΄Π°Ρ‡Ρƒ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Classloader

  1. Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° классов: Classloader Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ классов (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .class) ΠΈΠ· classpath Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ.
  2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° классов: ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Classloader провСряСт Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ класса для обСспСчСния Π΅Π³ΠΎ коррСктности ΠΈ бСзопасности.
  3. БвязываниС классов: Classloader связываСт Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ классы, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ссылок ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ символов.
  4. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ классов: Classloader ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ классы, вызывая ΠΈΡ… статичСскиС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ Classloader

  • Bootstrap ClassLoader: Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов, встроСнный Π² JVM. Он Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ основныС классы Java ΠΈΠ· Ρ„Π°ΠΉΠ»Π° rt.jar, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ классы ΠΈΠ· java.lang, java.util ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ…. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ языкС ΠΈ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ядра JVM.
  • Extension ClassLoader (Platform ClassLoader): Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ классы ΠΈΠ· стандартных Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Java, находящихся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ jre/lib/ext ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ систСмным ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ java.ext.dirs. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ дирСктория jre/lib/ext ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² старых вСрсиях Java, Π° Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Π΅ вСрсии ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π‘Π°ΠΌ загруТаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Bootstrap ClassLoader.
  • Application ClassLoader (System ClassLoader): Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ классы прилоТСния ΠΈΠ· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ classpath. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это дирСктория, указанная Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния CLASSPATH ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки -cp. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ классов ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

public class Main {
    public static void main(String[] args) {
        ClassLoader classLoader = Main.class.getClassLoader();
        System.out.println("ClassLoader: " + classLoader);
 
        try {
            Class<?> aClass = classLoader.loadClass("Example");
            System.out.println("Class loaded: " + aClass.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Classloader для динамичСской Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ классов Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Он ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² случаях, ΠΊΠΎΠ³Π΄Π° классы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ нСизвСстны Π½Π° этапС компиляции ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… источников, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ создании ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, добавляСмых Π½Π° Π»Π΅Ρ‚Ρƒ.

ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹ΠΉ Classloader

МоТно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ собствСнныС Classloader, Ρ€Π°ΡΡˆΠΈΡ€ΡΡ класс java.lang.ClassLoader, для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ классов ΠΈΠ· нСстандартных источников (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, сСти ΠΈΠ»ΠΈ Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π°Ρ€Ρ…ΠΈΠ²ΠΎΠ²). Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° трСбуСтся Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ обновляСмыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈΠ»ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· нСобходимости пСрСзапуска всСй систСмы. НапримСр, кастомный Classloader ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ систСмы ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Π³Π΄Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ динамичСски ΠΏΠΎ запросу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
 
public class CustomClassLoader extends ClassLoader {
 
    @Override
    public Class<?> findClass(String name) throws ClassNotFoundException {
        try {
            byte[] bytes = loadClassData(name);
            return defineClass(name, bytes, 0, bytes.length);
        } catch (IOException e) {
            throw new ClassNotFoundException(name, e);
        }
    }
 
    private byte[] loadClassData(String name) throws IOException {
        String path = name.replace('.', '/') + ".class";
        InputStream inputStream = Files.newInputStream(Paths.get(path));
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int data;
        while ((data = inputStream.read()) != -1) {
            byteArrayOutputStream.write(data);
        }
        return byteArrayOutputStream.toByteArray();
    }
}
  • ΠœΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ ClassLoader ΠΈ пСрСопрСдСляСм ΠΌΠ΅Ρ‚ΠΎΠ΄ findClass.
  • ΠœΠ΅Ρ‚ΠΎΠ΄ loadClassData Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ класса ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.
  • ΠœΠ΅Ρ‚ΠΎΠ΄ defineClass создаСт класс ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ массива.

ΠœΠ΅Ρ‚Π° информация

ΠžΠ±Π»Π°ΡΡ‚ΡŒ:: 00 Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°
Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ:: Class Loader Subsystem
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ::
Π‘ΠΎΠ·Π΄Π°Π½Π°:: 2024-11-04
Автор::

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹

Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ