מה התפקיד של ClassLoader בג'אווה?



מאמר זה מהווה מדריך מקיף כיצד פועל ClassLoader בג'אווה. הוא דן בסוגים, בעקרונות ובשיטות של ClassLoader בג'אווה.

בזמן העבודה בג'אווה אנו משתמשים לרוב במספר רב של שיעורים. שיעורי Java אלה אינם נטענים בבת אחת בזיכרון, במקום זאת הם נטענים כשנדרש על ידי יישום. כאן נכנסים לתמונה Java ClassLoaders. לכן במאמר זה אדון כיצד להשתמש ב- ClassLoader ב- Java יחד עם דוגמאות.

הנושאים הבאים יוסרו במאמר זה:





  1. מהו ClassLoader?
  2. סוגי ClassLoader
  3. עקרונות ClassLoader
  4. שיטות ClassLoader
  5. ClassLoader מותאם אישית

בואו נתחיל!

העמסת שיטה ועקיפת שיטה

מהו ClassLoader בג'אווה?

ClassLoader בג'אווה נקרא על ידי סביבת הריצה של Java לטעון באופן דינמי את הכיתות בכל פעם שנדרש על ידי היישום ב- מכונה וירטואלית של Java . מכיוון ש- ClassLoaders הם חלק מסביבת Java Runtime, למכונה הווירטואלית של Java לא יהיה שום מושג לגבי הקבצים ומערכות הקבצים הבסיסיים.



עכשיו, הבה נבין את הסוגים השונים של ClassLoaders מובנים ב- Java.

סוגי ClassLoader בג'אווה

הסוגים השונים של ClassLoaders ב- Java הם כדלקמן:

בואו נדון בכל אחד מהם אחד אחד.



הרחבה ClassLoader

כפי שהשם מרמז, Extension ClassLoader טוען את ההרחבות של שיעורי הליבה של Java מה- JDK ספריית הרחבות. זהו ילד מה- Bootstrap ClassLoader וטוען את התוספים מספריית JRE / lib / text או מכל ספרייה אחרת שצוינה במאפיין המערכת java.ext.dirs.

יישום או מערכת ClassLoader

האפליקציה או מערכת ClassLoader היא ילדה של הרחבה ClassLoader. סוג זה של ClassLoader טוען את כל המחלקות ברמת היישום שנמצאות באפשרות שורת הפקודה -cp או במשתנה הסביבה CLASSPATH.

Bootstrap ClassLoader

כמו שכולנו יודעים את זה שיעורי Java נטענים על ידי מופע של java.lang.ClassLoade. אך מכיוון ש- ClassLoaders הם שיעורים, ה- Bootstrap ClassLoader אחראי לטעון את המחלקות הפנימיות של JDK. BootStrap ClassLoader הוא קוד מכונה שמתחיל את הפעולה כאשר JVM קורא לו וטוען את הכיתות מ- rt.jar. לכן, אתה יכול להבין כי ל- Bootstrap ClassLoader אין שום ClassLoader הורה והוא מכונה לכן ClassLoader ראשוני.

הערה: העדיפות של Bootstrap גבוהה יותר מה- Extension, והעדיפות שניתנה ל- Extension ClassLoader גבוהה יותר מה- Application ClassLoader. עיין בתמונה למטה:

סוגי ClassLoader - ClassLoader בג

בהמשך במאמר זה, הבה נבין את העקרונות עליהם עובד ClassLoader.

עקרונות ClassLoader בג'אווה

מכלול הכללים שעל פיהם פועל Java ClassLoader הם שלושת העקרונות הבאים:

הבה נבין כל אחד מהם.

נכס ייחודיות

מאפיין זה מבטיח כי אין חזרה על שיעורים וכל השיעורים הם ייחודיים. מאפיין הייחודיות גם מוודא שהמחלקות נטענות על ידי ClassLoader האב אינם נטענים על ידי ClassLoader הצאצא. בתרחיש, שבו ה- ClassLoader ההורה אינו יכול למצוא את הכיתה, המופע הנוכחי ינסה לעשות זאת בעצמו.

מודל משלחת

ClassLoader בג'אווה עובד על בסיס מערך הפעולות הניתן על ידי מודל המשלחת. לכן, בכל פעם שנוצרת בקשה לאיתור מחלקה או משאב, מופע ClassLoader יאציל את החיפוש בכיתה או המשאב ל- ClassLoader האב.

מערך הפעולות שעל פיו פועל ClassLoader הוא כדלקמן:

  • המכונה הווירטואלית של Java בודקת אם הכיתה נטענת או לא, בכל פעם שהיא נתקלת בכיתה.
  • במקרה בו הכיתה טעונה JVM ממשיך עם ביצוע המחלקה, אבל בתרחיש שבו המחלקה לא נטענת, אזJVM מבקשת מתת-מערכת Java ClassLoader לטעון את אותה מחלקה מסוימת. לאחר מכן, מערכת המשנה ClassLoader נותנת שליטה ליישום ClassLoader.
  • ה- ClassLoader היישום ואז מאציל את הבקשה ל- Extension ClassLoader, אשר לאחר מכן מעביר את הבקשה ל- Bootstrap ClassLoader.
  • כעת, Bootstrap ClassLoader מחפש במסלול כיתה Bootstrap כדי לבדוק אם הכיתה זמינה או לא. אם הכיתה זמינה, היא נטענת, אחרת הבקשה מועברת שוב ל- Extension ClassLoader.
  • ה- Extension ClassLoader בודק את הכיתה בכתובת הרחבה.אם הכיתה זמינה, היא נטענת, אחרת הבקשה מועברת שוב ל- ClassLoader של היישום.
  • לבסוף, ClassLoader של היישום מחפש את הכיתה בנתיב הכיתה של היישום.אם המחלקה זמינה, היא נטענת, אחרת תראה חריג של ClassNotFoundException.

עיין בתמונה למטה.

עקרון נראות

על פי עיקרון זה, כיתות הילדים נראות לעיני הכיתות שנטענו על ידי ClassLoaders שלה, אך ההפך אינו נכון. לכן, למחלקות שנטענות על ידי היישום ClassLoader יש נראות למחלקות הנטענות על ידי Extension ו- Bootstrap ClassLoader.

לדוגמא, אם יש לנו שתי מחלקות: A & B, נניח שמחלקה A נטען על ידי היישום ClassLoader ומחלקה B נטענת על ידי הרחבות ClassLoader. כאן, המחלקות A ו- B גלויות לכל אותם מחלקות הנטענות על ידי ClassLoader של היישום, אך מחלקה B גלויה רק ​​למחלקות אלו שטעונות ClassLoader.

כמו כן, אם תנסה לטעון שיעורים אלה באמצעות Bootstrap ClassLoader, תראה את java.lang.ClassNotFoundException . יוצא מן הכלל.

מה זה בובה ושף

בסדר, עכשיו שאתה מכיר את סוגי ClassLoaders ואת העקרונות שעומדים מאחוריו, הבה נבחן כמה שיטות חשובותמ ה java.lang.ClassLoader מעמד.

שיטות ClassLoader בג'אווה

מעטים חיוניים של ClassLoader הם כדלקמן:

loadClass (שם מחרוזת, החלטה בוליאנית)

שיטה זו היא נקודת הכניסה של ClassLoader ומשמשת לטעינת המחלקה שה- JVM מפנה אליה. זה לוקח את שמו של ה- כפרמטר. JVM קורא לשיטת loadClass () כדי לפתור את הפניות המחלקה על ידי הגדרת הערך הבוליאני ל- true. רק אם עלינו לקבוע אם המחלקה קיימת או לא, הפרמטר הבוליאני מוגדר כ- false.

הַצהָרָה:

class ClassClass (שם מחרוזת, פתרון בוליאני) זורק ClassNotFoundException {

defineClass ()

שיטה סופית המשמשת להגדרת מערך בתים כמופע של מחלקה. במקרה שהמחלקה אינה חוקית אז היא זורקת ClassFormatError.

הַצהָרָה:

Class final DefinatedClass מוגן (שם מחרוזת, בתים [] b, int off, int len) זורק ClassFormatError

findClass (שם מחרוזת)

שיטת findClass משמשת לאיתור המחלקה שצוינה. אז זה פשוט מוצא את הכיתה עם שם מוסמך כפרמטר אבל לא טוען את הכיתה. שיטת loadClass () מפעילה שיטה זו אם ClassLoader האב אינו יכול למצוא את המחלקה המבוקשת. כמו כן, אם אף הורה ל- ClassLoader לא מוצא את הכיתה, יישום ברירת המחדל זורק a ClassNotFoundException.

הַצהָרָה:

מחלקה מוגנת findClass (שם מחרוזת) זורק ClassNotFoundException

Class.forName (שם מחרוזת, אתחול בוליאני, מטעין ClassLoader)

שיטה זו משמשת לטעינה ולאתחול של הכיתה. זה נותן אפשרות לבחור כל אחד מה- ClassLoaders ולהפוך את הפרמטר ClassLoader ל- NULL, ואז באופן אוטומטי נעשה שימוש ב- Bootstrap ClassLoader..

הַצהָרָה:

Class static ציבורי forName (שם מחרוזת, אתחול בוליאני, מטעין ClassLoader) זורק ClassNotFoundException

getParent ()

שיטת getParent משמשת להחזרת ה- ClassLoader האב להאצלה.

הַצהָרָה:

גמר ציבורי ClassLoader getParent ()

getResource ()

כפי שהשם מרמז, שיטת getResource () ניסתה למצוא משאב עם השם הנתון. בתחילה זה יאציל את הבקשה ל- ClassLoader ההורה עבור המשאב. במקרה שההורה אפס, מחפשים אחר הנתיב של ClassLoader המובנה ב- JVM. כעת, אם פעולה זו נכשלת, השיטה תפעיל את findResource (מחרוזת) כדי למצוא את המשאב, שם שם המשאב מוגדר כקלט שיכול להיות מסלול הכיתה המוחלט או היחסי. לאחר מכן, הוא מחזיר אובייקט URL לקריאת המשאב או מחזיר ערך null אם למשאב אין הרשאות מתאימות להחזרת המשאב או שהוא לא נמצא.

הַצהָרָה:

כתובת אתר ציבורית getResource (שם מחרוזת)

לאחר מכן, במאמר זה על ClassLoader בג'אווה, תן לנו להבין את ClassLoader המותאם אישית.

ClassLoader מותאם אישית ב- Java

ה- ClassLoaders המובנים יטפלו ברוב המקרים שהקבצים כבר נמצאים במערכת הקבצים, אך אם ברצונך לטעון את הכיתות מהכונן הקשיח המקומי, עליך להשתמש ב- ClassLoaders בהתאמה אישית.

צור ClassLoader מותאם אישית

כדי ליצור ClassLoader מותאם אישית, עליך להאריך את ה- ClassLoader בכיתה ולדרוס את findClass () שיטה:

דוגמה: בואו ניצור ClassLoader מותאם אישית אשר מרחיב את ClassLoader המוגדר כברירת מחדל וטוען מערך בתים מהקובץ שצוין. עיין בקוד להלן.

חבילה edureka ייבוא ​​java.io.ByteArrayOutputStream ייבוא ​​java.io.File ייבוא ​​java.io.IOException ייבוא ​​java.io.InputStream מחלקה ציבורית דוגמה מרחיבה את ClassLoader {@Override public Class findClass (מחרוזת מדגם מחרוזת) זורק ClassNotFoundException {byte [] b = customLoad (samplename) return defineClass (samplename, b, 0, b.length)} בתים פרטיים [] customLoadClassFromFile (מחרוזת שם משתמש) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. separatorChar) + '.class') בייט [] חיץ ByteArrayOutputStream bStream = חדש ByteArrayOutputStream () int nextValue = 0 נסה {בעוד ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} לתפוס (IOException e) {e.printStackTrace ()} חיץ = bStream.toByteArray () מאגר החזרה}}

עם זאת, אנו מגיעים לסוף מאמר זה על ClassLoader בג'אווה. אני מקווה שהבנתם מה הם ClassLoaders בג'אווה, השיטות שלה, הסוגים השונים של ClassLoaders וכו '.

אם מצאת מאמר זה בנושא 'ClassLoader ב- Java', עיין ב מאת אדוריקה, חברת למידה מקוונת מהימנה עם רשת של יותר מ -250,000 לומדים מרוצים הפרוסים ברחבי העולם. אנו כאן כדי לעזור לך בכל שלב בדרכך, ולהיות מלבד שאלות ראיונות אלה ב- Java, אנו מגישים תוכנית לימודים המיועדת לסטודנטים ואנשי מקצוע שרוצים להיות ג'אווה מפתח.

php mysql_fetch_

יש לך שאלה עבורנו? אנא הזכיר זאת בסעיף ההערות של 'ClassLoader זה ב- Java ' ונחזור אליך בהקדם האפשרי.