Що таке Java ClassLoader?


174

У кількох простих реченнях, що таке Java ClassLoader, коли він використовується і чому?

Гаразд, я прочитав статтю у вікі. ClassLoader завантажує класи. ГАРАЗД. Тож якщо я включаю файли jar та імпортую, ClassLoader виконує цю роботу.

Чому я повинен турбуватися з цим ClassLoader? Я ніколи його не використовував і не знав, що він існує.

Питання в тому, чому існує клас ClassLoader? А також, як ви це використовуєте на практиці? (Випадки існують, я знаю.)


Ви отримаєте кращі результати, якщо звузите своє запитання, наприклад, вказавши на конкретну частину, яку ви не розумієте, як вона пов’язана з якоюсь іншою мовою, з якою ви знайомі тощо.
JRL,

75
Це цілком розумне запитання, якщо дивитися з точки зору того, хто шукає кілька простих пропозицій, щоб пояснити поняття
oxbow_lakes

Відповіді:


231

Взяте з цього приємного підручника від Sun:

Мотивація

Програми, написані статично складеними мовами програмування, такими як C та C ++, збираються в рідні, спеціальні для машини інструкції та зберігаються як виконуваний файл. Процес об'єднання коду у виконавчий нативний код називається зв’язуванням - злиттям окремо складеного коду з спільним кодом бібліотеки для створення виконуваної програми. Це відрізняється від динамічно складених мов програмування, таких як Java. У Java файли .class, згенеровані компілятором Java, залишаються такими, що є, поки не завантажуються у віртуальну машину Java (JVM) - іншими словами, процес зв’язку виконується JVM під час виконання. Заняття завантажуються в JVM на основі "за потребою". І коли завантажений клас залежить від іншого класу, тоді і цей клас завантажується.

Коли програма Java запускається, перший клас для запуску (або точка входу в додаток) - це клас із загальнодоступним статичним методом недійсності, який називається main (). Цей клас зазвичай має посилання на інші класи, і всі спроби завантаження посиланих класів здійснює завантажувач класів.

Щоб отримати відчуття цього рекурсивного завантаження класу, а також ідеї завантаження класу загалом, розгляньте наступний простий клас:

public class HelloApp {
   public static void main(String argv[]) {
      System.out.println("Aloha! Hello and Bye");
   }
}

Якщо ви запустите цей клас із зазначенням параметра командного рядка -verbose: class, щоб він друкував, які класи завантажуються, ви отримаєте вихід, який виглядає наступним чином. Зауважте, що це лише частковий вихід, оскільки тут список занадто довгий для показу.

prmpt>java -verbose:class HelloApp



[Opened C:\Program Files\Java\jre1.5.0\lib\rt.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jsse.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jce.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
[Loaded java.lang.Throwable from shared objects file]
.
.
.
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Loaded java.security.Principal from shared objects file]
[Loaded java.security.cert.Certificate from shared objects file]
[Loaded HelloApp from file:/C:/classes/]
Aloha! Hello and Bye
[Loaded java.lang.Shutdown from shared objects file]
[Loaded java.lang.Shutdown$Lock from shared objects file]

Як бачите, спочатку завантажуються класи виконання Java, необхідні класу додатків (HelloApp).

Навантажувачі класів на платформі Java 2

Мова програмування Java постійно розвивається, щоб полегшити життя розробників додатків щодня. Це робиться шляхом надання API, які спрощують ваше життя, дозволяючи сконцентруватися на бізнес-логіці, а не на деталях впровадження основних механізмів. Це очевидно недавньою зміною J2SE 1.5 на J2SE 5.0 з метою відображення зрілості платформи Java.

Станом на JDK 1.2, завантажувач класів завантажувального класу, вбудований у JVM, відповідає за завантаження класів виконання Java. Цей завантажувач класів завантажує лише класи, які знаходяться у завантажувальному класі, і оскільки це довірені класи, процес перевірки не виконується, як для ненадійних класів. Окрім завантажувача класу завантаження, JVM має завантажувач класів розширень, відповідальний за завантаження класів із стандартних API розширень, та завантажувач системного класу, який завантажує класи як із загального шляху до класів, так і з ваших класів додатків.

Оскільки завантажувач класів більше, ніж вони, вони представлені у дереві, коренем якого є завантажувач класу завантажувального класу. Кожен завантажувач класів має посилання на свій завантажувач батьківського класу. Коли запитувачу завантажувача класу пропонується завантажити клас, він намагається завантажити його батьківський завантажувач класів перед тим, як спробувати завантажити сам елемент. Батько в свою чергу проконсультується з батьком тощо. Тож лише після того, як усі навантажувачі класів предків не зможуть знайти клас, залучається поточний навантажувач класів. Іншими словами, використовується модель делегування.

Клас java.lang.ClassLoader

Це java.lang.ClassLoaderабстрактний клас, який можна підкласифікувати додатками, яким необхідно розширити спосіб, яким JVM динамічно завантажує класи. Конструктори у java.lang.ClassLoader(та його підкласах) дозволяють вказати батьків під час інстанціювання нового завантажувача класів. Якщо явно не вказати батьків, завантажувач системного класу віртуальної машини буде призначений як батьківський за замовчуванням. Іншими словами, клас ClassLoader використовує модель делегування для пошуку класів та ресурсів. Отже, кожен екземпляр ClassLoader має пов'язаний завантажувач батьківського класу, так що коли його запитують знайти клас або ресурси, завдання делегується його завантажувачу батьківського класу перед тим, як намагатися знайти сам клас або ресурс. loadClass()Метод ClassLoader виконує наступні завдання, для того, коли викликається для завантаження класу:

Якщо клас уже завантажений, він повертає його. В іншому випадку він делегує пошук нового класу завантажувачу батьківського класу. Якщо завантажувач батьківського класу не знаходить клас, loadClass()викликає метод findClass()пошуку та завантаження класу. У finalClass()пошуках методу для класу в поточному завантажувач класу , якщо клас ні знайдені батьківським загрузчиком класів.


Докладніше в оригінальній статті, де також показано, як реалізувати власні навантажувачі мережевого класу, яка відповідає на ваше запитання, чому (і як). Дивіться також документи API .


47

Більшість розробників Java ніколи не потребує явного використання навантажувачів класів (крім завантаження ресурсів, щоб вони все ще працювали, коли вони вбудовані в JAR), не кажучи вже про те, щоб написати свої власні.

ClassLoaders використовується у великих системах та серверних додатках, щоб виконувати такі дії:

  • Модулюйте систему та завантажуйте, вивантажуйте та оновлюйте модулі під час виконання
  • Використовуйте різні версії бібліотеки API (наприклад, аналізатор XML) паралельно
  • Виділіть різні програми, що працюють в одному JVM (гарантуючи, що вони не заважають один одному, наприклад, через статичні змінні)

29

Питання "Чому варто турбувати цей клас ClassLoader"?

Ну, переважно, ви можете виправити речі, якщо вони пішли не так :-).

Це правда, доки ви просто пишете заявку, компілюєте її в JAR і, можливо, включаєте кілька додаткових бібліотек JAR, вам не потрібно знати про навантажувачі класів, це просто працюватиме.

Тим не менш, корисно трохи дізнатися про навантажувачі класів та завантаження класів, щоб краще зрозуміти, що відбувається за кадром. Як приклад, "статичні ініціалізатори" запускатимуться при завантаженні класу, тому, щоб зрозуміти, коли вони будуть працювати, потрібно знати, як завантажувач класів вирішує, коли їх завантажувати.

також .. як ти це використовуєш на практиці?

Для простих випадків вони вам не потрібні. Однак якщо вам потрібно динамічно завантажувати код під час виконання з явним керуванням, звідки він походить (наприклад, завантаження через мережу, завантаження плагінів, недоступних під час компіляції тощо), можливо, вам доведеться зробити більше. Тоді ви можете, наприклад, написати власний навантажувач класу. Інші відповіді див. За посиланнями.


14

ClassLoaderна Java - це клас, який використовується для завантаження файлів класів на Java. Код Java компілюється у файл класу javacкомпілятором, а JVM виконує програму Java шляхом виконання байтових кодів, записаних у файлі класу.

ClassLoader відповідає за завантаження файлів класу з файлової системи, мережі або будь-якого іншого джерела. Існують три завантажувачі класів за замовчуванням, які використовуються в Java, Bootstrap , Extension та навантажувачі класів систем або додатків .

ClassLoader


Як працює ClassLoader

## Взаємодія ClassLoader з JVM введіть тут опис зображення

Більше @: how-classloader-works-in-java.html


6

Навантажувачі класів - це функціональний компонент JVM, який завантажує дані класів з файлу '.class' або з мережі в зону методів у Heap.

Схоже, це невід'ємна частина JVM, але як кінцевий користувач Java, чому я повинен турбуватися? Ось чому:

Кожен завантажувач класів має власний простір імен, і класи, на які посилається певний завантажувач класів, потрапляють у його простір імен.

Класи, на які посилаються два завантажувачі класів, не матимуть видимості один одного, що призводить до підвищення безпеки.

Механізм делегування батьків-початківців класів забезпечує те, що класи java api ніколи не можуть бути зламані несанкціонованим кодом.

Детальніше дивіться тут


1

Навантажувачі класів є ієрархічними. Класи вводяться в JVM, оскільки вони посилаються на ім'я в класі, який вже працює в JVM.

Як завантажився перший клас?
Перший клас завантажується за допомогою static main()методу, оголошеного у вашому класі. Усі завантажені згодом класи завантажуються класами, які вже завантажуються та працюють.

Завантажувач класів створює простір імен. Усі JVM включають щонайменше один завантажувач класу, який вбудований в JVM, який називається первинним (або завантажувальним) навантажувачем класу. Це одне, і ми розглянемо навантажувачі класів, що не є первинними. У JVM є гачки, що дозволяють використовувати завантажувачі, визначені користувачем, замість початкового навантажувача класу. Ось навантажувачі класів, створені JVM.

Завантажувальний пристрій (первинний) Цей завантажувач класів не завантажується повторно. Завантажує внутрішні класи JDK, пакети java. * (Зазвичай завантажує rt.jar та i18n.jar). Виставки Цей завантажувач класу не підлягає завантаженню. Завантажує файли jar із каталогу розширень JDK (зазвичай lib / ext JRE). Система Цей завантажувач класу не завантажується. Завантажує класи зі шляху системного класу.

http://www.sbalasani.com/2015/01/java-class-loaders.html


1

Коли ви запитуєте, чому існує клас ClassLoader, причина досить проста - саме клас відповідає за пошук і завантаження файлів класу під час виконання .

Розробимо це.

У JVM кожен клас завантажується якимось екземпляром java.lang.ClassLoader. Кожного разу, коли ви починаєте новий JVM звичайною java <classname>командою запуску програми Java , першим кроком є ​​завантаження всіх ключових класів у пам'яті, необхідних для правильної роботи як java.lang.Objectі інших класів виконання ( rt.jar).

Тепер насправді є 3 частини для ClassLoader:

  • BootstrapClassLoaderНесе відповідальність за ці класи доступні є завантаження цих класів в пам'яті.

  • Наступне завдання - завантажити будь-які зовнішні бібліотеки / JAR в пам'ять для належної роботи програми. ExtClassLoaderВідповідає за це завдання. Цей завантажувач класів відповідає за завантаження всіх файлів .jar, згаданих у шляху java.ext.dirs.

  • Третім і головним важливим навантажувачем класу є AppClassLoader. Завантажувач класів додатків відповідає за завантаження файлів класу, згаданих у властивості системи java.class.path.

Важливо також зазначити, що реалізація за замовчуванням ClassLoader може бути відмінена, що дозволяє налаштувати JVM корисними та цікавими способами, що дозволяє повністю переглядати, як файли класів вносяться в систему.

введіть тут опис зображення

Перевірте це, щоб дізнатися більше про завантажувач Java Class .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.