--- aliases: - Class Loader - Class Loaders tags: - maturity/🌱 date: 2024-11-04 --- ## ВСзисы - Classloader β€” это ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ JVM, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ классов Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. - Classloader выполняСт Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ, связываниС ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ классов. - Π’ Java сущСствуСт иСрархия Classloader: Bootstrap, Extension (Platform), ΠΈ Application (System). - ΠšΠ»Π°ΡΡΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ ΠΈΠ· нСстандартных источников с использованиСм кастомного Classloader, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для создания ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… систСм ΠΈΠ»ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ². *** Classloader β€” это ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ [[Java Virtual Machine|JVM]], ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ классов Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ Java ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π³ΠΎ использованиСм, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Classloader выполняСт эту Π·Π°Π΄Π°Ρ‡Ρƒ. **Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Classloader** 1. **Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° классов**: Classloader Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ»Ρ‹ классов (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ `.class`) ΠΈΠ· classpath Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. 2. **ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° классов**: ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Classloader провСряСт [[Java Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄|Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄]] класса для обСспСчСния Π΅Π³ΠΎ коррСктности ΠΈ бСзопасности. 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`. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ классов ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ```java 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 ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ систСмы ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Π³Π΄Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ динамичСски ΠΏΠΎ запросу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ```java 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` создаСт класс ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ массива. *** ## ΠœΠ΅Ρ‚Π° информация **ΠžΠ±Π»Π°ΡΡ‚ΡŒ**:: [[../../meta/zero/00 Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°|00 Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°]] **Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ**:: [[Class Loader Subsystem|Class Loader Subsystem]] **Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ**:: **Π‘ΠΎΠ·Π΄Π°Π½Π°**:: [[2024-11-04]] **Автор**:: ### Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ - ### Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ