Каква е ролята на ClassLoader в Java?



Тази статия е изчерпателно ръководство за това как ClassLoader работи в Java. Той обсъжда видовете, принципите и методите на ClassLoader в Java.

Докато работим в Java, често използваме голям брой класове. Тези Java класове не се зареждат наведнъж в паметта, а се зареждат, когато се изисква от приложение. Тук се появяват Java ClassLoaders. Така че в тази статия ще обсъдя как да използвам ClassLoader в Java заедно с примери.

В тази статия ще бъдат разгледани следните теми:





  1. Какво е ClassLoader?
  2. Видове ClassLoader
  3. Принципи на ClassLoader
  4. Методи на ClassLoader
  5. Персонализиран ClassLoader

Нека започнем!

Какво е ClassLoader в Java?

ClassLoader в Java се извиква от Java Runtime Environment за динамично зареждане на класовете, когато това се изисква от приложението в Виртуална машина Java . Тъй като ClassLoaders са част от Java Runtime Environment, Java Virtual Machine няма да има представа за основните файлове и файлови системи.



Сега нека да разберем различните видове вградени ClassLoaders в Java.

Видове ClassLoader в Java

Различните видове ClassLoaders в Java са както следва:

Нека обсъдим всеки един от тях един по един.



Разширение ClassLoader

Както подсказва името, Extension ClassLoader зарежда разширенията на основните Java класове от JDK Библиотека с разширения. Тя е дъщерна на Bootstrap ClassLoader и зарежда разширенията от директорията JRE / lib / text или друга директория, посочена в системното свойство java.ext.dirs.

Приложение или System ClassLoader

Приложението или System ClassLoader е дъщерно на разширението ClassLoader. Този тип ClassLoader зарежда всички класове на ниво приложение, намерени в опцията на командния ред -cp или в променливата на средата CLASSPATH.

Bootstrap ClassLoader

Както всички знаем това Java класове се зареждат от екземпляр на java.lang.ClassLoade. Но тъй като ClassLoaders са класове, Bootstrap ClassLoader е отговорен за зареждането на вътрешните класове на JDK. BootStrap ClassLoader е машинен код, който стартира операцията, когато JVM го извика и зарежда класовете от rt.jar. Така че, можете да разберете, че Bootstrap ClassLoader обслужва няма родителски ClassLoader и по този начин е известен като Primordial ClassLoader.

Забележка: Приоритетът на Bootstrap е по-висок от Extension, а приоритетът, даден на Extension ClassLoader, е по-висок от Application ClassLoader. Вижте изображението по-долу:

Видове ClassLoader - ClassLoader в Java - Edureka

След това в тази статия, нека разберем принципите, на които работи ClassLoader.

Принципи на ClassLoader в Java

Наборът от правила, въз основа на които работи Java ClassLoader, са следните три принципа:

Нека разберем всеки един от тях.

Уникалност

Това свойство гарантира, че няма повторение на класовете и всички класове са уникални. Уникалността също така гарантира, че класовете се зареждат от родителския ClassLoader, не се зареждат от дъщерния ClassLoader. В сценарий, при който родителят ClassLoader не може да намери класа, тогава текущият екземпляр ще се опита да го направи сам.

как да разпределя динамично масив в java

Модел на делегиране

ClassLoader в Java работи въз основа на набора от операции, дадени от модела на делегиране. Така че, когато се генерира заявка за намиране на клас или ресурс, тогава екземпляр ClassLoader ще делегира търсенето на класа или ресурса на родителския ClassLoader.

Наборът от операции, въз основа на които работи ClassLoader, е както следва:

  • Виртуалната машина Java проверява дали класът е зареден или не, когато попадне на клас.
  • В случая, когато класът е зареден JVM продължава с изпълнението на класа, но в случай, когато класът не е зареден, тогаваJVM иска от подсистемата Java ClassLoader да зареди този конкретен клас. След това подсистемата ClassLoader дава контрол на Application ClassLoader.
  • След това приложението ClassLoader делегира заявката на разширението ClassLoader, което след това предава заявката на Bootstrap ClassLoader.
  • Сега Bootstrap ClassLoader търси вBootstrap classpath, за да проверите дали класът е достъпен или не. Ако класът е наличен, той се зарежда, в противен случай заявката отново се предава на разширението ClassLoader.
  • Разширението ClassLoader проверява за класа в пътя на класа на разширението.Ако класът е наличен, той се зарежда, в противен случай заявката отново се предава на Application ClassLoader.
  • И накрая, Application ClassLoader търси класа в пътя на класа на приложението.Ако класът е наличен, тогава се зарежда, иначе ще видите изключение на ClassNotFoundException.

Вижте изображението по-долу.

Принцип на видимост

Съгласно този принцип детските класове са видими за класовете, заредени от неговите родители ClassLoaders, но обратното не е вярно. И така, класовете, заредени от Application ClassLoader, имат видимост в класовете, заредени от Extension и Bootstrap ClassLoader.

Например, ако имаме два класа: A & B, приемете, че клас A се зарежда от Application ClassLoader и клас B се зарежда от Extensions ClassLoader. Тук класовете A и B са видими за всички класове, заредени от Application ClassLoader, но клас B е видим само за тези класове, заредени от Extension ClassLoader.

Също така, ако се опитате да заредите тези класове с помощта на Bootstrap ClassLoader, ще видите java.lang.ClassNotFoundException . изключение.

Добре, сега, след като знаете видовете ClassLoaders и принципите, които стоят зад него, нека разгледаме няколко важни методаот java.lang.ClassLoader клас.

Методи на ClassLoader в Java

Малко съществени на ClassLoader са както следва:

loadClass (Име на низ, логическо разрешаване)

Този метод е входната точка на ClassLoader и се използва за зареждане на класа, посочен от JVM. Взема името на като параметър. JVM извиква метода loadClass (), за да разреши препратките към класа, като зададе логическата стойност на true. Само ако трябва да определим дали класът съществува или не, булевият параметър е зададен на false.

Декларация:

публичен клас loadClass (Име на низ, логическо разрешаване) хвърля ClassNotFoundException {

defineClass ()

Последен метод, използван за дефиниране на масив от байтове като екземпляр на клас. В случай, че тогава класът е невалиден, той изхвърля ClassFormatError.

Декларация:

защитен окончателен клас defineClass (Име на низ, байт [] b, int off, int len) хвърля ClassFormatError

findClass (Име на низ)

Методът findClass се използва за намиране на посочения клас. Така че той просто намира класа с напълно квалифицирано име като параметър, но не зарежда класа. Методът loadClass () извиква този метод, ако родителският ClassLoader не може да намери искания клас. Също така, ако никой родител на ClassLoader не намери класа, изпълнението по подразбиране изхвърля a ClassNotFoundException.

Декларация:

защитен клас findClass (име на низ) изхвърля ClassNotFoundException

Class.forName (Име на низ, булева инициализация, зареждащ ClassLoader)

Този метод се използва за зареждане и инициализиране на класа. Той дава възможност да изберете някой от ClassLoaders и в случай, че параметърът ClassLoader е NULL, след което автоматично се използва Bootstrap ClassLoader.

Декларация:

публичен статичен клас за Име (Име на низ, булева инициализация, зареждане на ClassLoader) изхвърля ClassNotFoundException

getParent ()

Методът getParent се използва за връщане на родителския ClassLoader за делегиране.

Декларация:

публичен финал ClassLoader getParent ()

getResource ()

Както подсказва името, методът getResource () се опита да намери ресурс с даденото име. Първоначално ще делегира заявката на родителския ClassLoader за ресурса. В случай че родителят е нула, тогава се търси пътят на ClassLoader, вграден в JVM. Сега, ако това не успее, тогава методът ще извика findResource (String), за да намери ресурса, където името на ресурса е посочено като вход, който може да бъде абсолютен или относителен път на класа. След това връща URL обект за четене на ресурса или връща нулева стойност, ако ресурсът няма подходящи привилегии за връщане на ресурса или не е намерен.

Декларация:

публичен URL getResource (име на низ)

След това, в тази статия за ClassLoader в Java, нека разберем Custom ClassLoader.

Персонализиран ClassLoader в Java

Вградените ClassLoaders ще се погрижат за повечето случаи, когато файловете вече са във файловата система, но ако искате да заредите класовете от локалния твърд диск, тогава трябва да използвате персонализирани ClassLoaders.

Създайте персонализиран ClassLoader

За да създадете персонализиран ClassLoader, трябва да разширите ClassLoader клас и замени findClass () метод:

Пример: Нека създадем персонализиран ClassLoader, който разширява стандартния ClassLoader и зарежда байтов масив от посочения файл. Вижте кода по-долу.

пакет edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Sample extends ClassLoader {@Override public Class findClass (String samplename) хвърля ClassNotFoundException {byte [] (samplename) return defineClass (samplename, b, 0, b.length)} private byte [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofile.replace ('.', File. separatorChar) + '.class') байт [] буфер ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ()) = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

С това стигаме до края на тази статия за ClassLoader в Java. Надявам се, че сте разбрали какво представляват ClassLoaders в Java, нейните методи, различните видове ClassLoaders и т.н.

Ако сте намерили тази статия за „ClassLoader в Java“, разгледайте от Edureka, доверена компания за онлайн обучение с мрежа от над 250 000 доволни учащи, разпространени по целия свят. Ние сме тук, за да ви помогнем във всяка стъпка по вашето пътуване, за да станете освен тези въпроси за интервю за Java, измислим учебна програма, предназначена за студенти и професионалисти, които искат Java Разработчик.

Имате въпрос към нас? Моля, споменете го в раздела за коментари на този „ClassLoader в Java ' и ние ще се свържем с вас възможно най-скоро.