يدرس هذه المقالة بشكل أساسي المحتوى ذي الصلة للتحميل الديناميكي Java لملفات JAR و Class ، على النحو التالي.
ملفات الفئة التي يتم تحميلها في Java ديناميكية. بمعنى آخر ، سنقوم فقط بالتحميل عندما نستخدمه ، وإذا لم نستخدمه ، فلن نحمل صفنا.
توفر لنا Java آليتين ديناميكيين. الأول هو الآلية الضمنية. والثاني هو آلية العرض. على النحو التالي:
طريقتين:
تحتوي طريقة class.forname () على نموذجين:
public static Class forName(String className)public static Class forName(String className, boolean initialize,ClassLoader loader) إن استدعاء طريقة forname () مع معلمة واحدة فقط تعادل class.forname (className ، true ، loader).
يجب توصيل كلتا الطريقتين بالطريقة الأصلية ForName0 () في النهاية.
ForName () مع ثلاثة معلمات ، آخر مكالمة هي: forName0 (الاسم ، التهيئة ، المحمل) ؛
سواء كنت تستخدم جديدًا لإنشاء إنشاء فئة معينة ، أو باستخدام طريقة class.forname () مع معلمة واحدة فقط ، فإن خطوات "تحميل كتل الكود الثابتة" Class + Running "ضمنية.
عند استخدام طريقة class.forname () بثلاث معلمات ، إذا كانت المعلمة الثانية خاطئة ، فسيقوم محمل الفئة بتحميل الفئة فقط ولن يقوم بتهيئة كتلة الكود الثابت. فقط عندما يتم إنشاء فئة ، سيتم تهيئة كتلة الكود الثابت. تتم تهيئة كتلة الرمز الثابت عندما يتم إنشاء مثيل للمرة الأولى.
يستخدم ClassLoader لتحميل الفصل. عند تحميل فئة ، سيتم أيضًا تحميل جميع الفئات التي يشار إليها في هذه الفئة ، وهذا التحميل متكرر. وهذا يعني ، إذا كان A يشير إلى B و B يشير إلى C ، ثم عند تحميل A ، سيتم أيضًا تحميل B ، وعندما يتم تحميل B ، سيتم تحميل C أيضًا. العودية حتى حتى جميع الأحمال الفئة المطلوبة بشكل جيد.
package com.demo java.lang.reflect.method ؛ import java.net.malformedurlexception ؛ import java.net.url ؛ import java.net.urlclasslassloader ؛ public class dynamicloaddemo {enum filetype {gar ، class ، ot} فئة ثابتة. يلقي fileNotfoundException {class <؟> cls = findloadedClass (name) ؛ if (cls! = null) {return cls ؛} fileInputStream fis = new FileInputStream (file) ؛ bytearrayoutputstream baos = new bytearRayoutStream () ؛ fis.Read (Buffer) ؛ if (len == -1) {break ؛} baos.write (المخزن المؤقت ، 0 ، len) ؛} // fileInputStream هو عملية فارغة ، لأن التدفق هو وظيفة كتابة الأشياء في ذاكرة التخزين المؤقت إلى الكيان (القرص الصلب أو الشبكة). ليست هناك حاجة هنا لذلك فهي فارغة. //baos.flush () ؛ byte [] data = baos.tobytearray () ؛ return defedeclass (null ، data ، 0 ، data.length) ؛} catch (ioException e) {e.printstacktrace () ؛} أخيرًا {try {baos.close () ؛ {fis.close () ؛} catch (ioException e) {E.PrintStackTrace () ؛}} return null ؛}} main public static void main (string [] args) {String className = "com.demo.test.helloworld" ؛ string [] = {"helloworld.jar" ، " {String lowerPath = path.toLowerCase () ؛ fileType fileType = fileType.other ؛ if (lowerpath.endswith (". jar") || lowerpath.endswith (". zip")) {fileType = filetype.jar ؛ == fileType.Older) {return ؛} ملف ملف = ملف جديد (مسار) ؛ if (! file.exists ()) {return ؛} جرب {url url = file.touri (). ourl () ؛ system.out.println (url.toString ()) ؛ class <؟> cls = null ؛ urlClassLoader (url new url [] {url} ، thread.currentThread (). null) {return ؛} // مثيل حقل متغير الحقل = cls.getDeclaredField ("Hello") ؛ if (! field.isAccessible ()) {field.setAccible (true) ؛} system.out.println (field.get (cls.newinstance ())) ؛ cls.getDeclaredMethod ("Saystatichello" ، null) ؛ if (! staticmethod.isaccessible ()) {staticmethod.setAccessible (true) ؛} // إذا كانت قيمة الإرجاع للوظيفة باطلة ، nullstaticmethod.invoke (cls ، null) ؛ {method.setAccessible (true) ؛} الكائن ret = method.invoke (cls.newinstance () ، "Hello World") ؛ system.out.println (ret) ؛} catch (malformedurlex e) {e.printstacktrace () ؛} catch (classnotfoundexception e) { {E.PrintStackTrace () ؛} catch (SecurityException e) {E.PrintStackTrace () ؛} catch (alfortalAccessException e) {e.printstacktrace () ؛ {E.PrintStackTrace () ؛} catch (nosuchfieldException e) {نتيجة:
ما ورد أعلاه هو كل محتوى هذه المقالة حول تحليل Java Dynamic Loading JAR ومحالات ملف الفئة. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!