JavaRush /جاوا بلاگ /Random-SD /JVM ۾ ڪلاس ڪيئن لوڊ ڪيا ويا آهن
Aleksandr Zimin
سطح
Санкт-Петербург

JVM ۾ ڪلاس ڪيئن لوڊ ڪيا ويا آهن

گروپ ۾ شايع ٿيل
پروگرامر جي ڪم جو سڀ کان ڏکيو حصو مڪمل ٿيڻ کان پوءِ ۽ ”هيلو ورلڊ 2.0“ ايپليڪيشن لکي وئي آهي، باقي اهو آهي ته ڊسٽريبيوشن ڪٽ کي گڏ ڪرڻ ۽ ان کي گراهڪ ڏانهن منتقل ڪرڻ، يا گهٽ ۾ گهٽ ٽيسٽنگ سروس ڏانهن. تقسيم ۾، هر شيء ائين آهي جيئن اهو هجڻ گهرجي، ۽ جڏهن اسان پنهنجو پروگرام شروع ڪيو، جاوا ورچوئل مشين منظر تي اچي ٿي. اهو ڪو راز ناهي ته ورچوئل مشين ڪلاس فائلن ۾ پيش ڪيل حڪمن کي بائيٽ ڪوڊ جي صورت ۾ پڙهي ٿي ۽ انهن کي پروسيسر ڏانهن هدايتون طور ترجمو ڪري ٿي. مان ورچوئل مشين ۾ حاصل ڪرڻ بائيٽ ڪوڊ جي اسڪيم بابت ٿورو سمجھڻ جي تجويز ڏيان ٿو.

ڪلاس لوڊ ڪندڙ

اهو JVM کي مرتب ڪيل بائيٽ ڪوڊ جي فراهمي لاءِ استعمال ڪيو ويندو آهي، جيڪو عام طور تي ايڪسٽينشن سان فائلن ۾ محفوظ ڪيو ويندو آهي .class، پر ٻين ذريعن کان پڻ حاصل ڪري سگهجي ٿو، مثال طور، نيٽ ورڪ تي ڊائون لوڊ ڪيل يا ايپليڪيشن پاران ٺاهيل. JVM - 1 ۾ ڪئين ڪلاس لوڊ ڪيا وڃن ٿاجاوا SE جي وضاحت جي مطابق، JVM ۾ ڪوڊ هلائڻ لاء، توھان کي ٽن مرحلن کي پورو ڪرڻ جي ضرورت آھي:
  • وسيلن مان بائيٽ ڪوڊ لوڊ ڪرڻ ۽ ڪلاس جو مثال ٺاهڻClass

    ھن ۾ شامل آھي درخواست ڪيل ڪلاس کي ڳولھڻ انھن مان جيڪي اڳ لوڊ ڪيا ويا آھن، لوڊ ڪرڻ لاءِ بائيٽ ڪوڊ حاصل ڪرڻ ۽ ان جي درستي کي جانچڻ، ڪلاس جو مثال ٺاھيو Class(ان سان گڏ رن ٽائم تي ڪم ڪرڻ لاءِ)، ۽ پيرن ڪلاس لوڊ ڪرڻ. جيڪڏهن والدين ڪلاس ۽ انٽرفيس لوڊ نه ڪيا ويا آهن، ته پوءِ سوال ۾ ڪلاس کي لوڊ ٿيل نه سمجهيو ويندو.

  • پابند (يا ڳنڍڻ)

    وضاحت جي مطابق، هي اسٽيج ٽن وڌيڪ مرحلن ۾ ورهايل آهي:

    • تصديق ، وصول ٿيل بائيٽ ڪوڊ جي درستگي جي جانچ ڪئي وئي آهي.
    • تياري ، جامد شعبن لاءِ RAM مختص ڪرڻ ۽ انھن کي ڊفالٽ ويلز سان شروع ڪرڻ (ھن صورت ۾، واضح شروعات، جيڪڏھن ڪو آھي، اڳ ۾ ئي شروعاتي اسٽيج تي ٿئي ٿو).
    • قرارداد ، قسم، شعبن ۽ طريقن جي علامتي لنڪ جو حل.
  • حاصل ڪيل اعتراض کي شروع ڪرڻ

    هتي، پوئين پيراگراف جي برعڪس، هر شي واضح ٿي لڳي ته ڇا ٿيڻ گهرجي. اهو، يقينا، اهو سمجهڻ دلچسپ آهي ته اهو ڪيئن ٿئي ٿو.

اهي سڀئي مرحلا هيٺين گهرجن سان ترتيب ڏنل آهن:
  • ڪلاس کي ڳنڍڻ کان اڳ مڪمل طور تي لوڊ ڪيو وڃي.
  • ھڪڙي طبقي کي مڪمل طور تي آزمائشي ۽ تيار ڪيو وڃي ان کان اڳ شروع ڪيو وڃي.
  • لنڪ ريزوليوشن غلطيون پروگرام جي عمل جي دوران ٿينديون آهن، جيتوڻيڪ اهي ڳنڍڻ واري اسٽيج تي معلوم ڪيا ويا آهن.
جئين توهان ڄاڻو ٿا، جاوا لاڳو ڪري ٿو سست (يا سست) ڪلاس جي لوڊ ڪرڻ. هن جو مطلب آهي ته لوڊ ٿيل طبقي جي حوالن جي شعبن جي طبقن جي لوڊشيڊنگ تيستائين نه ڪئي ويندي جيستائين ايپليڪيشن انهن کي واضح حوالي سان منهن نه ڏئي. ٻين لفظن ۾، علامتي ڳنڍڻ کي حل ڪرڻ اختياري آهي ۽ ڊفالٽ سان نه ٿيندو آهي. بهرحال، JVM عمل درآمد پڻ توانائي واري طبقي جي لوڊشيڊنگ کي استعمال ڪري سگھي ٿو، يعني. سڀني علامتي لنڪ کي فوري طور تي اڪائونٽ ۾ ورتو وڃي. اهو هن نقطي لاء آهي ته آخري گهربل لاڳو ٿئي ٿو. اهو پڻ نوٽ ڪرڻ جي قابل آهي ته علامتي لنڪ جي قرارداد ڪلاس لوڊ ڪرڻ جي ڪنهن به مرحلي سان ڳنڍيل ناهي. عام طور تي، انهن مرحلن مان هر هڪ سٺي مطالعي لاءِ ٺاهيندو آهي؛ اچو ته پهرين کي سمجهڻ جي ڪوشش ڪريون، يعني بائيٽ ڪوڊ لوڊ ڪرڻ.

جاوا لوڊ ڪندڙن جا قسم

جاوا ۾ ٽي معياري لوڊ ڪندڙ آھن، جن مان ھر ھڪ ڪلاس ھڪڙي مخصوص جڳھ کان لوڊ ڪري ٿو:
  1. بوٽ اسٽريپ هڪ بنيادي لوڊر آهي، جنهن کي Primordial ClassLoader پڻ سڏيو ويندو آهي.

    rt.jar آرڪائيو مان معياري JDK ڪلاس لوڊ ڪري ٿو

  2. ايڪسٽينشن ڪلاس لوڊر - ايڪسٽينشن لوڊر.

    ايڪسٽينشن ڪلاس لوڊ ڪري ٿو، جيڪي ڊفالٽ طور jre/lib/ext ڊاريڪٽري ۾ موجود آهن، پر java.ext.dirs سسٽم جي ملڪيت طرفان سيٽ ڪري سگھجن ٿيون.

  3. سسٽم ڪلاس لوڊر - سسٽم لوڊ ڪندڙ.

    CLASSPATH ماحوليات جي متغير ۾ بيان ڪيل ايپليڪيشن ڪلاس لوڊ ڪري ٿو

جاوا ڪلاس لوڊ ڪندڙن جو هڪ ترتيب وار استعمال ڪري ٿو، جتي روٽ آهي، يقينا، بنيادي هڪ. اڳيان اچي ٿو ايڪسٽينشن لوڊر، ۽ پوءِ سسٽم لوڊر. قدرتي طور تي، هر لوڊر والدين ڏانهن هڪ پوائنٽر کي ذخيرو ڪري ٿو ته جيئن ان کي لوڊ ڪرڻ جي نمائندي ڪرڻ جي قابل هجي انهي صورت ۾ ته اهو پاڻ اهو ڪرڻ جي قابل ناهي.

خلاصو ڪلاس ClassLoader

هر لوڊر، بنيادي هڪ جي استثنا سان، خلاصي طبقي جو اولاد آهي java.lang.ClassLoader. مثال طور، ايڪسٽينشن لوڊر جو نفاذ ڪلاس آهي sun.misc.Launcher$ExtClassLoader، ۽ سسٽم لوڊ ڪندڙ آهي sun.misc.Launcher$AppClassLoader. بنيادي لوڊر اصل آهي ۽ ان تي عمل درآمد JVM ۾ شامل آهي. ڪو به طبقو جيڪو وڌائي ٿو java.lang.ClassLoaderبليڪ جيڪ ۽ انهن ساڳين سان ڪلاس لوڊ ڪرڻ جو پنهنجو طريقو مهيا ڪري سگهي ٿو. هن کي ڪرڻ لاء، اهو ضروري آهي ته لاڳاپيل طريقن کي ٻيهر بيان ڪيو وڃي، جنهن کي هن وقت آئون صرف سطحي طور تي غور ڪري سگهان ٿو، ڇاڪاڻ ته مان هن مسئلي کي تفصيل سان نه سمجهي سگهيو آهيان. هتي اهي آهن:
package java.lang;
public abstract class ClassLoader {
    public Class<?> loadClass(String name);
    protected Class<?> loadClass(String name, boolean resolve);
    protected final Class<?> findLoadedClass(String name);
    public final ClassLoader getParent();
    protected Class<?> findClass(String name);
    protected final void resolveClass(Class<?> c);
}
loadClass(String name)ڪجھ عوامي طريقن مان ھڪڙو، جيڪو ڪلاس لوڊ ڪرڻ لاء داخلا پوائنٽ آھي. ان تي عمل درآمد هڪ ٻئي محفوظ طريقي کي سڏڻ لاءِ هيٺ اچي ٿو loadClass(String name, boolean resolve)، جنهن کي ختم ڪرڻ جي ضرورت آهي. جيڪڏهن توهان هن محفوظ ٿيل طريقي جي Javadoc تي نظر وجهو ٿا، توهان هيٺ ڏنل ڪجهه سمجهي سگهو ٿا: ٻه پيرا ميٽر ان پٽ طور فراهم ڪيا ويا آهن. ھڪڙو آھي ڪلاس جو بائنري نالو (يا مڪمل طور تي قابل ڪلاس جو نالو) جنھن کي لوڊ ڪرڻ جي ضرورت آھي. ڪلاس جو نالو سڀني پيڪيجز جي فهرست سان بيان ڪيو ويو آهي. ٻيو پيٽرولر هڪ پرچم آهي جيڪو اهو طئي ڪري ٿو ته ڇا علامتي لنڪ جي قرارداد گهربل آهي. ڊفالٽ طور اهو غلط آهي ، جنهن جو مطلب آهي سست ڪلاس لوڊ ڪرڻ استعمال ڪيو ويندو آهي. وڌيڪ، دستاويزن جي مطابق، طريقي جي ڊفالٽ عمل ۾، هڪ ڪال ڪئي وئي آهي findLoadedClass(String name)، جيڪو چيڪ ڪري ٿو ته ڇا ڪلاس اڳ ۾ ئي لوڊ ڪيو ويو آهي ۽، جيڪڏهن ائين آهي، هن طبقي ڏانهن هڪ حوالو واپس ڪري ٿو. ٻي صورت ۾، والدين لوڊ ڪندڙ جي ڪلاس لوڊ ڪرڻ جو طريقو سڏيو ويندو. جيڪڏهن لوڊ ڪندڙن مان ڪو به لوڊ ٿيل ڪلاس نه ڳولي سگهي، انهن مان هر هڪ، ريورس آرڊر ۾، انهي طبقي کي ڳولڻ ۽ لوڊ ڪرڻ جي ڪوشش ڪندو، اوور رائيڊ ڪندي findClass(String name). ان تي وڌيڪ تفصيل سان باب ”ڪلاس لوڊنگ اسڪيم“ ۾ بحث ڪيو ويندو. ۽ آخرڪار، آخري نه پر گهٽ ۾ گهٽ، ڪلاس لوڊ ٿيڻ کان پوءِ، حل جي پرچم جي بنياد تي ، اهو فيصلو ڪيو ويندو ته ڇا ڪلاس لوڊ ڪرڻ لاءِ علامتي لنڪ ذريعي. هڪ واضح مثال اهو آهي ته ريزوليوشن اسٽيج کي ڪلاس لوڊ ڪرڻ واري مرحلي دوران سڏي سگهجي ٿو. ان جي مطابق، طبقي کي وڌائڻ ClassLoader۽ ان جي طريقن کي ختم ڪندي، ڪسٽم لوڊ ڪندڙ بائيٽ ڪوڊ کي ورچوئل مشين تائين پهچائڻ لاءِ پنهنجو منطق لاڳو ڪري سگھي ٿو. جاوا پڻ "موجوده" ڪلاس لوڊر جي تصور کي سپورٽ ڪري ٿو. موجوده لوڊ ڪندڙ اهو آهي جيڪو هن وقت تي عمل ڪندڙ طبقي کي لوڊ ڪري ٿو. هر طبقي کي خبر آهي ته اهو ڪهڙي لوڊر سان لوڊ ڪيو ويو آهي، ۽ توهان اها معلومات حاصل ڪري سگهو ٿا ان کي ڪال ڪندي String.class.getClassLoader(). سڀني ايپليڪيشن طبقن لاء، "موجوده" لوڊر عام طور تي سسٽم هڪ آهي.

ڪلاس لوڊ ڪرڻ جا ٽي اصول

  • وفد

    ڪلاس لوڊ ڪرڻ جي درخواست پيرن لوڊ ڪندڙ کي منظور ڪئي وئي آهي، ۽ ڪلاس کي لوڊ ڪرڻ جي ڪوشش صرف ان صورت ۾ ڪئي ويندي آهي جڏهن والدين لوڊ ڪندڙ ڪلاس کي ڳولڻ ۽ لوڊ ڪرڻ ۾ ناڪام هو. اهو طريقو توهان کي ڪلاس لوڊ ڪرڻ جي اجازت ڏئي ٿو لوڊر سان جيڪو ممڪن طور تي بنيادي طور تي ويجهو آهي. اهو حاصل ڪري ٿو وڌ ۾ وڌ درجي جي نمائش. هر لوڊر انهن طبقن جو رڪارڊ رکي ٿو جيڪي هن طرفان لوڊ ڪيا ويا آهن، انهن کي پنهنجي ڪيش ۾ رکي ٿو. انهن طبقن جي سيٽ کي اسڪوپ سڏيو ويندو آهي.

  • ڏيکاءُ

    لوڊ ڪندڙ صرف "پنهنجي" طبقن ۽ "والدين" جا طبقن کي ڏسي ٿو ۽ انهن طبقن جي باري ۾ ڪا به ڄاڻ ناهي جيڪي هن جي "ٻار" طرفان لوڊ ڪيا ويا آهن.

  • انفراديت

    هڪ ڪلاس صرف هڪ ڀيرو لوڊ ڪري سگهجي ٿو. وفد جي ميکانيزم کي يقيني بڻائي ٿو ته لوڊر جيڪو ڪلاس لوڊ ڪرڻ جي شروعات ڪري ٿو هڪ طبقي کي اوورلوڊ نٿو ڪري جيڪا اڳ ۾ JVM ۾ لوڊ ڪئي وئي هئي.

اهڙيء طرح، جڏهن هن جي بوٽ لوڊر لکڻ، هڪ ڊولپر کي انهن ٽن اصولن جي رهنمائي ڪرڻ گهرجي.

ڪلاس لوڊ ڪرڻ جو منصوبو

جڏهن ڪلاس لوڊ ڪرڻ لاءِ ڪال اچي ٿي، اهو ڪلاس موجوده لوڊر جي اڳ ۾ ئي لوڊ ٿيل ڪلاسن جي ڪيش ۾ ڳولهيو ويندو آهي. جيڪڏهن گهربل طبقو اڳ ۾ لوڊ نه ڪيو ويو آهي، وفد جو اصول والدين لوڊر کي ڪنٽرول منتقل ڪري ٿو، جيڪو هڪ سطح تي اعلي سطح تي واقع آهي. والدين لوڊ ڪندڙ پڻ ڪوشش ڪري ٿو گهربل ڪلاس کي پنهنجي ڪيش ۾ ڳولڻ جي. جيڪڏهن ڪلاس اڳ ۾ ئي لوڊ ٿي چڪو آهي ۽ لوڊ ڪندڙ ان جي جڳهه کي ڄاڻي ٿو، پوء Classانهي طبقي جو هڪ اعتراض واپس ڪيو ويندو. جيڪڏهن نه، ڳولا جاري رهندي جيستائين اهو بنيادي بوٽ لوڊر تائين پهچي. جيڪڏهن بيس لوڊر وٽ گهربل ڪلاس بابت معلومات نه آهي (يعني اهو اڃا لوڊ نه ڪيو ويو آهي)، هن ڪلاس جو بائيٽ ڪوڊ ڪلاسن جي جڳهه ۾ ڳولهيو ويندو جنهن بابت ڏنل لوڊر کي خبر آهي، ۽ جيڪڏهن ڪلاس نه ٿو ڪري سگهي. لوڊ ڪيو وڃي، ڪنٽرول واپس چائلڊ لوڊر ڏانهن موٽندو، جيڪو ان کي ڄاڻايل ذريعن کان لوڊ ڪرڻ جي ڪوشش ڪندو. جيئن مٿي ذڪر ڪيو ويو آهي، بيس لوڊر لاءِ ڪلاسن جو مقام rt.jar لائبريري آهي، ايڪسٽينشن لوڊر لاءِ - ڊاريڪٽري jre/lib/ext extension سان، سسٽم ون لاءِ - CLASSPATH، استعمال ڪندڙ لاءِ اهو ڪجهه مختلف ٿي سگهي ٿو. . اهڙيء طرح، لوڊشيڊنگ طبقن جي ترقي مخالف سمت ۾ وڃي ٿي - روٽ لوڊر کان موجوده ھڪڙي تائين. جڏهن ڪلاس جو بائيٽ ڪوڊ مليو آهي، ڪلاس کي JVM ۾ لوڊ ڪيو ويندو آهي ۽ قسم جو هڪ مثال حاصل ڪيو ويندو آهي Class. جئين توهان آساني سان ڏسي سگهو ٿا، بيان ڪيل لوڊشيڊنگ اسڪيم مٿي ڏنل طريقي سان عمل ڪرڻ سان ملندڙ جلندڙ آهي loadClass(String name). هيٺ توهان هن آرياگرام ۾ ڏسي سگهو ٿا.
JVM - 2 ۾ ڪلاس ڪيئن لوڊ ڪيا ويا آهن

نتيجي طور

ٻولي سکڻ جي پهرين مرحلن ۾، اهو سمجهڻ جي ڪا خاص ضرورت ناهي ته جاوا ۾ ڪلاس ڪيئن لوڊ ڪيا ويندا آهن، پر انهن بنيادي اصولن کي ڄاڻڻ سان توهان کي نااميدي کان بچڻ ۾ مدد ملندي جڏهن غلطين کي منهن ڏيڻو پوندو جهڙوڪ ClassNotFoundExceptionيا NoClassDefFoundError. خير، يا گهٽ ۾ گهٽ سمجھو ته مسئلي جي پاڙ ڇا آهي. اهڙيء طرح، هڪ استثنا ClassNotFoundExceptionتڏهن ٿئي ٿو جڏهن هڪ طبقي کي متحرڪ طور تي لوڊ ڪيو ويندو آهي پروگرام جي عمل دوران، جڏهن لوڊ ڪندڙ گهربل ڪلاس نه ڳولي سگهندا آهن يا ته ڪيش ۾ يا ڪلاس جي رستي سان. پر غلطي NoClassDefFoundErrorوڌيڪ نازڪ آهي ۽ ٿيندي آهي جڏهن گهربل ڪلاس ڪمپليشن دوران موجود هو، پر پروگرام جي عمل دوران نظر نه آيو. اهو ٿي سگهي ٿو جيڪڏهن پروگرام لائبريري کي شامل ڪرڻ وساريو ته اهو استعمال ڪري ٿو. يقينن، اوزار جي جوڙجڪ جي اصولن کي سمجهڻ جي بلڪل حقيقت جيڪا توهان پنهنجي ڪم ۾ استعمال ڪندا آهيو (ضروري ناهي ته ان جي کوٽائي ۾ واضح ۽ تفصيلي وسرجن) هن ميڪانيزم جي اندر واقع ٿيندڙ عملن کي سمجهڻ ۾ ڪجهه وضاحت شامل ڪري ٿي، جنهن ۾، موڙ، هن اوزار جي اطمينان واري استعمال جي ڪري ٿي.

ذريعا

جاوا ۾ ڪيئن ClassLoader ڪم ڪندو آهي مجموعي طور تي هڪ تمام مفيد ذريعو معلومات جي رسائي واري پيشڪش سان. ڪلاس لوڊ ڪري رهيو آهي، ClassLoader ڪافي ڊگهو مضمون آهي، پر ان ڳالهه تي زور ڀريو ويو آهي ته انهن ساڳين سان پنهنجو پنهنجو لوڊر لاڳو ڪيئن ڪجي. ClassLoader: طبقن جي متحرڪ لوڊشيڊنگ بدقسمتي سان، هي وسيلو هاڻي دستياب ناهي، پر اتي مون کي ڪلاس لوڊ ڪرڻ واري اسڪيم سان سڀ کان وڌيڪ سمجھڻ وارو ڊراگرام مليو، تنهنڪري مان مدد نه ٿو ڪري سگهان پر ان کي شامل ڪري سگهان ٿو. جاوا SE وضاحت: باب 5. لوڊ ڪرڻ، ڳنڍڻ، ۽ شروعات ڪرڻ
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION