logo

ЦлассЛоадер у Јави

Јава ЦлассЛоадер

Јава ЦлассЛоадер је апстрактна класа. Припада а јава.ланг пакет. Учитава класе из различитих ресурса. Јава ЦлассЛоадер се користи за учитавање класа током извршавања. Другим речима, ЈВМ обавља процес повезивања током извршавања. Класе се учитавају у ЈВМ према потреби. Ако учитана класа зависи од друге класе, учитава се и та класа. Када захтевамо да учитамо класу, она делегира класу свом родитељу. На овај начин се одржава јединственост у окружењу извршавања. Неопходно је извршити Јава програм.

сед цомманд
ЦлассЛоадер у Јави

Јава ЦлассЛоадер је заснован на три принципа: Делегација , Видљивост , и Јединственост .

    Принцип делегирања:Он прослеђује захтев за учитавање класе учитачу родитељске класе. Учитава класу само ако родитељ не пронађе или учита класу.Принцип видљивости:Омогућава учитавачу класа да види све класе које је учитан родитељ ЦлассЛоадер. Али учитавач надређених класа не може да види класе које је учитан подређени учитавач класа.Принцип јединствености:Омогућава учитавање класе једном. То се постиже принципом делегирања. Обезбеђује да дете ЦлассЛоадер не учитава поново класу, коју је већ учитао родитељ.

Типови ЦлассЛоадер-а

У Јави, сваки ЦлассЛоадер има унапред дефинисану локацију одакле учитавају датотеке класе. Постоје следећи типови ЦлассЛоадер-а у Јави:

Боотстрап Цласс Лоадер: Учитава стандардне датотеке ЈДК класа из рт.јар и других основних класа. То је родитељ свих учитавача класа. Нема родитеља. Када позовемо Стринг.цласс.гетЦлассЛоадер() он враћа нулл, а било који код заснован на њему избацује НуллПоинтерЕкцептион. Такође се зове Примордиал ЦлассЛоадер. Учитава датотеке класа из јре/либ/рт.јар. На пример, класа пакета јава.ланг.

Учитавач класа екстензија: Он делегира захтев за учитавање класе свом родитељу. Ако је учитавање класе неуспешно, она учитава класе из јре/либ/ект директоријума или било ког другог директоријума као јава.ект.дирс. Имплементира га сун.мисц.Лаунцхер$ЕктЦлассЛоадер у ЈВМ.

Учитавач класе система: Учитава специфичне класе за апликацију из променљиве окружења ЦЛАССПАТХ. Може се подесити приликом позивања програма помоћу опција командне линије -цп или цласспатх. То је дете Ектенсион ЦлассЛоадер-а. Имплементира га класа сун.мисц.Лаунцхер$АппЦлассЛоадер. Сав Јава ЦлассЛоадер имплементира јава.ланг.ЦлассЛоадер.

ЦлассЛоадер у Јави

Како ЦлассЛоадер ради у Јави

Када ЈВМ захтева класу, он позива метод лоадЦласс() класе јава.ланг.ЦлассЛоадер преношењем потпуно класификованог имена класе. Метод лоадЦласс() позива методу финдЛоадедЦласс() да провери да ли је класа већ учитана или не. Потребно је избегавати вишеструко учитавање класе.

Ако је класа већ учитана, она делегира захтев надређеном ЦлассЛоадер-у да учи класу. Ако ЦлассЛоадер не проналази класу, он позива метод финдЦласс() да би потражио класе у систему датотека. Следећи дијаграм показује како ЦлассЛоадер учитава класу у Јави користећи делегирање.

ЦлассЛоадер у Јави

Претпоставимо да имамо специфичну класу Демо.цласс. Захтев за учитавање датотека ове класе преноси се у Апплицатион ЦлассЛоадер. Он делегира свом родитељу Ектенсион ЦлассЛоадер. Даље, делегира се на Боотстрап ЦлассЛоадер. Боотстрап претражи ту класу у рт.јар и пошто те класе нема. Сада затражите пренос у Ектенсион ЦлассЛоадер који тражи директоријум јре/либ/ект и покушава да лоцира ову класу тамо. Ако се класа нађе тамо, Ектенсион ЦлассЛоадер учитава ту класу. Апликација ЦлассЛоадер никада не учитава ту класу. Када га проширење ЦлассЛоадер не учита, онда га апликација ЦлаасЛоадер учитава из ЦЛАССПАТХ у Јави.

Принцип видљивости каже да подређени ЦлассЛоадер може да види класу коју је учитао родитељ ЦлассЛоадер, али обрнуто није тачно. То значи да ако Апплицатион ЦлассЛоадер учитава Демо.цласс, у том случају, покушај експлицитног учитавања Демо.цласс користећи Ектенсион ЦлассЛоадер избацује јава.ланг.ЦлассНотФоундЕкцептион.

Према принципу јединствености, класу коју је учитао родитељ не би требало поново да учитава Цхилд ЦлассЛоадер. Дакле, могуће је написати учитавач класа који крши принципе делегирања и јединствености и сам учитава класу.

Укратко, учитавач класа следи следеће правило:

  • Проверава да ли је класа већ учитана.
  • Ако класа није учитана, замолите родитељски учитавач класе да учита класу.
  • Ако учитавач родитељске класе не може да учита класу, покушајте да је учитате у овом учитавачу класа.

Размотрите следећи пример:

 public class Demo { public static void main(String args[]) { System.out.println('How are you?'); } } 

Компилирајте и покрените горњи код користећи следећу команду:

 javac Demo.java java -verbose:class Demo 

-вербосе:цласс: Користи се за приказ информација о класама које учитава ЈВМ. Корисно је када се користи учитавач класа за динамичко учитавање класа. Следећа слика приказује излаз.

ЦлассЛоадер у Јави

Можемо приметити да се класе извршавања које захтева класа апликације (Демо) прво учитавају.

Када се класе учитају

Постоје само два случаја:

  • Када се изврши нови бајт код.
  • Када бајт код прави статичку референцу на класу. На пример, Систем.оут .

Статичко наспрам динамичког учитавања класе

Класе се статички учитавају са 'нев' оператором. Динамичко учитавање класе позива функције учитавача класа у време извођења помоћу методе Цласс.форНаме().

Разлика између лоадЦласс() и Цласс.форНаме()

Метод лоадЦласс() учитава само класу, али не иницијализује објекат. Док метода Цласс.форНаме() иницијализује објекат након учитавања. На пример, ако користите ЦлассЛоадер.лоадЦласс() за учитавање ЈДБЦ драјвера, учитавач класа не дозвољава учитавање ЈДБЦ драјвера.

Метода јава.ланг.Цласс.форНаме() враћа Цласс Објецт заједно са класом или интерфејсима са датим именом стринга. Избацује ЦлассНотФоундЕкцептион ако класа није пронађена.

Пример

У овом примеру, класа јава.ланг.Стринг је учитана. Штампа име класе, име пакета и имена свих доступних метода Стринг класе. Користимо Цласс.форНаме() у следећем примеру.

Класа: Представља објекат класе који може бити било ког типа (? је џокер знак). Тип класе садржи мета-информације о класи. На пример, тип Стринг.цласс је Цласс. Користите Цласс ако је класа која се моделира непозната.

гетДецларедМетход(): Враћа низ који садржи Метход објекте који одражавају све декларисане методе класе или интерфејса представљене овим објектом Цласс, укључујући јавне, заштићене, подразумевани (пакет) приступ и приватне методе, али искључујући наслеђене методе.

гетНаме(): Враћа име методе представљено овим Метход објектом, као стринг.

 import java.lang.reflect.Method; public class ClassForNameExample { public static void main(String[] args) { try { Class cls = Class.forName('java.lang.String'); System.out.println('Class Name: ' + cls.getName()); System.out.println('Package Name: ' + cls.getPackage()); Method[] methods = cls.getDeclaredMethods(); System.out.println('-----Methods of String class -------------'); for (Method method : methods) { System.out.println(method.getName()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } } 

Излаз

 Class Name: java.lang.String Package Name: package java.lang -----Methods of String class ------------- value coder equals length toString hashCode getChars ------ ------ ------ intern isLatin1 checkOffset checkBoundsOffCount checkBoundsBeginEnd access0 access0