هل هناك طريقة لإجبار جهاز التحميل على تحميل حزمة حتى لو لم يتم تحميل أي من فصوله؟

StackOverflow https://stackoverflow.com/questions/1816730

سؤال

دعنا نقول أن قاعدة كود java لها حزمة تسمى "com.example".

في وقت التشغيل ، يمكننا الحصول على هذه الحزمة عن طريق الاتصال

Package p = Package.getPackage( "com.example" ); //(returns null)

أو حتى الحصول على قائمة بجميع الحزم عن طريق الاتصال

Packages[] ps = Package.getPackages();

المشكلة هي - إذا لم يتم تحميل ClassLoader بعد أي فئة من الحزمة ، فلن يكون متاحًا لمكالمات الوظائف هذه. يمكننا إجبارها على تحميل الحزمة عن طريق تحميل إحدى الفصول في الحزمة أولاً ، مثل هذا:

this.getClass().getClassLoader().loadClass( "com.example.SomeClass" );
Package p = Package.getPackage( "com.example" ); //(returns non-null)

ومع ذلك ، هذا هو الاختراق ويتطلب معرفة في وقت مبكر اسم بعض الفصول التي تنتمي إلى الحزمة.

لذا فإن السؤال هو - هل هناك أي طريقة للحصول على مثيل للحزمة بالاسم ، بغض النظر عما إذا كان جهاز تحميل الفئة قد فعل أي شيء أم لا؟ هل افتراضاتي حول كيف يبدو أن صياغة الحزم/الحزم تعمل في هذا الموقف؟

هل كانت مفيدة؟

المحلول

أفترض أنك بحاجة إلى هذا لأنك تحتاج إلى فحص تعليقات التعليقات التوضيحية الخاصة بها. وإلا فلن تكون مهتمًا بوجود مرجع حزمة لا تدور سوى العمليات في الوصول إلى التعليقات التوضيحية. هذا يؤدي إلى الافتراض بأن لديك أيضًا حزمة-java التي تم تعريفها هناك مع بعض التعليقات التوضيحية.

إذا قمت بفحص java.lang.Package سترى أن getPackageInfo فقط يقوم بتحميل فئة الحزمة في فئة عادية.

واجهت نفس المشكلة وتوصلت إلى هذا الحل.

public static Package getPackage(String packageName) throws ClassNotFoundException {
    Class.forName(packageName+".package-info"); // makes sure package info exist and that the class loader already knows about the package
    return Package.getPackage(packageName);
}

نصائح أخرى

بدلاً من ذلك ، يمكنك استخدام دليل جذر الفصل كنقطة انطلاق وتجول عبر جميع ملفات *.class والأدلة الفرعية. هذا سيعمل فقط إذا كنت تعرف أين ستقيم جميع ملفات .class مسبقًا.

سبب كل هذا هو أن Java لديها صنف ديناميكي ، بحيث يمكن تحميل الفصول في وقت التشغيل من مواقع غير معروفة في وقت الترجمة أو حتى في وقت بدء التشغيل. لذلك فإن مفهوم الحزمة هو مجرد مساحة اسم للفئات المحملة ، وليس دليلًا يمكنك استخدامه للبحث عنها.

أخشى أن تكون افتراضاتك غير صالحة. يقوم كل من أدوات التحميل بتعليق الحزم أثناء تحميل الفصول الدراسية.

يمكنك تمرير بطاقة Wildcard إلى ClassLoader.getResources وإجبارها على التقاط الفصول في حزمة ، والتي بدورها ستفعل العمل.

يمكنك جعل جهاز تحميل الصرف الخاص بك هو المكالمات definePackage, ، لكن هذا لن يساعدك في استخدام محولات فئة الفانيليا المعتادة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top