كيف يمكنني إعطاء java.util.Random بذرة معينة في فئات الطرف الثالث؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

لدي برنامج Java يقوم بتحميل ملفات فئة الطرف الثالث (الفصول التي لم أكتبها) ويقوم بتنفيذها.غالبًا ما تستخدم هذه الفئات java.util.Random, ، والذي يقوم افتراضيًا بإنشاء قيم أولية عشوائية في كل مرة يتم إنشاء مثيل لها.لأسباب تتعلق بقابلية التكاثر، أريد أن أعطي هذه الفئات نفس بذرة البداية في كل مرة، وأغيرها فقط حسب تقديري.

فيما يلي بعض الحلول الواضحة، ولماذا لا تعمل:

  1. استخدم فئة عشوائية مختلفة في ملفات فئة الطرف الثالث.المشكلة هنا هي أنني أقوم بتحميل ملفات الفصل الدراسي فقط، ولا أستطيع تعديل المصدر.

  2. استخدم أداة تحميل فئة مخصصة لتحميل الفئة العشوائية الخاصة بنا بدلاً من إصدار JVM.لن ينجح هذا الأسلوب لأن Java لا تسمح لمحملي الفصل بتجاوز الفئات في ملف java طَرد.

  3. مبادلة خارج rt.jar java.util.Random التنفيذ الخاص بنا، أو وضع الملفات في مواقع موثوقة لـ JVM.تتطلب هذه الأساليب من مستخدم التطبيق العبث بتثبيت JVM على أجهزته، وهي ليست جيدة.

  4. إضافة العرف java.util.Random فئة إلى bootclasspath.على الرغم من أن هذا قد ينجح من الناحية الفنية، إلا أنه بالنسبة لهذا التطبيق تحديدًا، فهو غير عملي لأن هذا التطبيق مخصص للمستخدمين النهائيين للتشغيل من IDE.أريد أن أجعل تشغيل التطبيق مناسبًا للمستخدمين، مما يعني أن إجبارهم على تعيين مسار Bootclass الخاص بهم أمر مؤلم.لا يمكنني إخفاء هذا في برنامج نصي، لأنه مصمم للتشغيل من IDE مثل Eclipse (لسهولة تصحيح الأخطاء).

فكيف يمكنني أن أفعل هذا؟

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

المحلول

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

نصائح أخرى

سيعمل خيارك 2 بالفعل، مع التوجيهات التالية.

ستحتاج (كما قال أنجاب) إلى تغيير مسار فئة التمهيد.

في سطر أوامر البرنامج تحتاج إلى إضافة ما يلي:

java -Xbootclasspath/p:C:\your andom_impl.jar YourProgram

بافتراض أنك تستخدم جهاز Windown أو المسار الخاص بهذا الأمر في أي نظام تشغيل.

يضيف هذا الخيار الفئات الموجودة في ملفات jar قبل تحميل rt.jar.لذلك سيتم تحميل Random الخاص بك قبل أن يتم تحميل فئة rt.jar Random.

يتم عرض الاستخدام عن طريق كتابة:

java -X

يعرض جميع ميزات X(tra) التي يمتلكها JVM.قد لا يكون متاحًا على تطبيقات VM الأخرى مثل JRockit أو غيرها ولكن هناك على Sun JVM.

-Xbootclasspath/ع:قم بوضعه مسبقًا أمام مسار فئة bootstrap

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

حظ سعيد.

يمكنك استخدام AOP لاعتراض المكالمات العشوائية وتدوير الوسيطة إلى ما تريد.

سام

على الرغم من أنه لا يجوز لك تغيير أداة تحميل الفصل بشكل تافه لحزم "java.x" و"sun.x"، إلا أن هناك طريقة لحساب تحميل الفصل (وتثبيت مستمع "بعد ترميز الفصل وتحميله") لفئات الأطروحات، لذلك يمكنك يمكن تعيين شيء مثل البذرة بعد تحميل الفئات من هذه الحزم.تَلمِيح:استخدم الانعكاس.

على أي حال، طالما أنني لا أملك المزيد من المعلومات عما تريد تحقيقه بالضبط، فمن الصعب جدًا مساعدتك هنا.

ملاحظة.:انتبه إلى أن الكتل "static {}" - قد تعيقك عن العبث بالبذور مرة أخرى.

"استخدم أداة تحميل فئة مخصصة لتحميل الفئة العشوائية الخاصة بنا بدلاً من إصدار JVM.لن ينجح هذا الأسلوب لأن Java لا تسمح لمحملي الفصل بتجاوز الفئات في حزمة جافا."

ماذا عن تغيير bootclasspath لاستخدام الفئة العشوائية المخصصة الخاصة بك؟

Br ، ~ a

نعم الخيار 2 يعمل:إنشاء فئتين لغرض الاختبار اسمه ThirdPartyClass.java و Random.java

جرة تم إنشاؤها من ThirdPartyClass.class

jar -cvf tpc.jar ThirdPartyClass.class

جرة تم إنشاؤها من Random.class

jar -cvf rt123.jar Random.class

بعد ذلك قم بالتنفيذ بالأمر التالي:

java  -Xbootclasspath/p:tcp.jar:rt123.jar -cp . -verbose ThirdPartyClass

سيكون الإخراج: seed value for ThirdPartyClass-> 1

كود المصدر ThirdPartyClass.java ----->

import java.util.Random;

public class ThirdPartyClass {
    ThirdPartyClass(long seed ) {
        System.out.println("seed value for ThirdPartyClass-> "+seed);
    }   

    public static void main(String [] args) {
        ThirdPartyClass tpc=new ThirdPartyClass(new Random().nextLong());
    }
}

كود المصدر Random.java ------->

package java.util;

import java.io.Serializable;

public class Random extends Object implements Serializable
{
    public Random() {
    }

    public Random(long seed) {
    }

    public long nextLong() {
        return 1;
    }
}

شكرا ماهافر براساد مالي

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