ClassLoader dinamichkeskaya клас натоварване - dmitriymx блог
ClassLoader: dinamichkeskaya натоварване клас
Ето един прост въпрос: как се определят класове в JVM. Правилният отговор е: пълното име на класа, състояща се от името на пакета, а името на свой собствен клас. От това заключението е, че програмата не може да съществува два класа със същото пълното име. Въпреки това, той не е така. В началното училище, където ни учеха на правилото "не може да се раздели на нула", а след това в гимназията, разказа за безкрайност, и в Java е "малката бяла лъжа".
В действителност, класове се идентифицират с името на пакета, собствения си име и клас. товарач, ClassLoader "у. По този начин, програмата може да бъде два класа с еднакви трите имена, а не да си пречат взаимно.
На тази и други екстри ClassLoader "и днес ще говорим.
Една от основните характеристики на Java е динамичен модел клас натоварване, което ви позволява да се зареди изпълним код без да презареждате основното приложение в JRE. Всеки клас се използва в по време на работа, така или иначе се качили товарач в Java. От началото на програмата, създадена три основни буутлоудъра:
- Начално зареждане ClassLoader - основен товарач;
- Удължаване ClassLoader - разширения товарач;
- Система ClassLoader - за начално зареждане.
Начално зареждане ClassLoader приложи на нивото на JVM и няма обратна връзка от средата за изпълнение. Според класовете товарач зарежда от директорията $ JAVA_HOME / ИЪ и всички основни класове. Ето защо, е опит да се получи клас товарач Java. * Винаги завършва null'om. Но ако наистина искате да се контролира натоварването на базовия клас, можете да използвате -Xbootclasspath ключ. която ви позволява да замените набор от базови класове.
Удължаване ClassLoader товари класове от директорията $ JAVA_HOME / ИЪ / вътр. The Sun JRE - клас sun.misc.Launcher $ ExtClassLoader. Управление на разширенията Можете да използвате опцията системата обувка java.ext.dirs.
Система ClassLoader вече се прилага в нивото JRE. The Sun JRE - клас sun.misc.Launcher $ AppClassLoader. Това товарач зарежда класове, пътят към който е определен в променливата CLASSPATH среда. Контролирайте класове натоварване на системата с помощта -classpath или система ключ опция
ClassLoader образуват йерархия, който е корен база товарач. Всички останали товарачи когато инициализиращите запазват линк към товарача родител. По този начин се постигне реализация зареждане модел делегация.
клас изтегляне десен рекурсивно делегирана от долния товарач в йерархията до най-високата. Този подход дава възможност за зареждане за зареждане на класове, което е най-близо до базата. Така се постига максимално обхвата на класа. В рамките на обхвата означава: всяко изтегляне води отчет на класовете, които са били натоварени с тях. Много от тези класове и тези области се появяват. В този случай, товарача вижда само "своите" клас и "майка" на класа и няма представа за класовете, които са били натоварени със своя "наследник".
Помислете процес качването по-подробно. Нека по време на работа се срещна декларация на променлива използва класа Багира. След процеса на класа търсене и сваляне ще бъде, както следва:
Сега мисля: каква класа е наистина натоварен, ако $ JAVA_HOME / ИЪ / вътр и CLASSPATH има класове с едни и същи трите имена? Точно така, в класа на $ JAVA_HOME / ИЪ / вътр. и никой не гледа на CLASSPATH. Въпреки всичко, не е само да го: класове са заредени в реда, в който са били, посочен в CLASSPATH. На този етап, ако два буркан-файл, например a.jar и b.jar, съдържаща същите класове, в памет на заредения клас a.jar и класа на b.jar се пропуска
Повтарям: всеки ClassLoader вижда "своята" клас и "майка" на класа. Курсове "потомци", много по-малко часове ", работещи в паралелни програми за изтегляне", на ClassLoader не виждат. Освен това, за JVM - това са различни класове. Когато се опитате да донесе един клас в друг ще предизвика java.lang.ClassCastException изключение. дори ако те са едни и същи и трите имена.
Сега, от думи към дела. Ако ще да се създаде клас товарач, важно е да се помни следното:
- товарач трябва явно или неявно разширите java.lang.Classloader клас;
- модел товарач делегация трябва да поддържа натоварването на йерархията. Ако това не бъде направено, не може да има проблеми с обхвата;
- класна стая java.lang.Classloader вече се прилага метод за директно изтегляне - defineClass (). който преобразува байт кода в java.lang.Class. извършване на неговото валидиране;
- рекурсивни механизъм търсене също се осъществява в java.lang.Classloader в класната стая и да се грижи за това не е необходимо;
- за правилното прилагане на зареждане е необходимо да замените само метод loadClass (клас java.lang.Classloader).
Нашата зареждане на ОС ще се зареди на JAR-файловете не са чрез java.net.URLClassLoader. и "ръчно". Така че по-ясно ще видите целия процес. И ние ще се изпращат приставки, които се намират в плъгини / папка и интерфейса, за които искате да се опише:
Сега нека да пишем за начално зареждане. Истината е, ние сме малко smuhlyuem и зареди плъгин веднъж всички класове в паметта:
Сега нека да напише основната заявка с помощта на нашия качване
Отличен. Остава да напише плъгина:
Ние опаковаме нашата приставка буркан и се съхранява в плъгини / директория.
Да, ние сме малко "измама", строго сочейки към подадената от клас се смята за входна точка, но това няма да се отрази на цялостната картина на това, което се случва. Нашата програма е успешно ще се зареди на приставката и да се съобразят с метод на пътуванията ().
О, щях да забравя. ". Програмата може да бъде два класа със същото пълното име и не си пречат взаимно. ". Спомням си, не забравяйте, сега показват.
Voila, две от един и същи клас на работа за нас, а не в конфликт. Въпреки това, ако се опитаме да направи така! JVM ще ни изпрати в ада (java.lang.ClassCastException), тъй като JVM е два напълно различни класа.