Π’Π΅Π·ΠΈΡΡ
- Classloader β ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ JVM, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠΈΠΉ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ Π·Π°Π³ΡΡΠ·ΠΊΡ ΠΊΠ»Π°ΡΡΠΎΠ² Π² ΠΏΠ°ΠΌΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
- Classloader Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΡ, ΠΏΡΠΎΠ²Π΅ΡΠΊΡ, ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ².
- Π Java ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ Classloader: Bootstrap, Extension (Platform), ΠΈ Application (System).
- ΠΠ»Π°ΡΡΡ ΠΌΠΎΠ³ΡΡ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ ΠΈΠ· Π½Π΅ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠ³ΠΎ Classloader, ΡΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ².
Classloader β ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ JVM, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠΈΠΉ Π·Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ Π·Π°Π³ΡΡΠ·ΠΊΡ ΠΊΠ»Π°ΡΡΠΎΠ² Π² ΠΏΠ°ΠΌΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π Java ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»Π°ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½ Π² ΠΏΠ°ΠΌΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Classloader Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΡ Π·Π°Π΄Π°ΡΡ.
Π€ΡΠ½ΠΊΡΠΈΠΈ Classloader
- ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΊΠ»Π°ΡΡΠΎΠ²: Classloader Π½Π°Ρ
ΠΎΠ΄ΠΈΡ ΠΈ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΡΠ°ΠΉΠ»Ρ ΠΊΠ»Π°ΡΡΠΎΠ² (ΠΎΠ±ΡΡΠ½ΠΎ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ
.class
) ΠΈΠ· classpath Π² ΠΏΠ°ΠΌΡΡΡ. - ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠ»Π°ΡΡΠΎΠ²: ΠΠΎΡΠ»Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Classloader ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π±Π°ΠΉΡ-ΠΊΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ° Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π΅Π³ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ.
- Π‘Π²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ²: Classloader ΡΠ²ΡΠ·ΡΠ²Π°Π΅Ρ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΡΡΠ»ΠΎΠΊ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
- ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ²: 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
ΠΠ²ΡΠΎΡ::