سؤال

هذا السؤال لديه بالفعل إجابة هنا:

هل هناك طريقة للحصول على عنوان جافا؟

من أين يأتي السؤال؟: في البداية ، قرأت ملف الخصائص وتم وضع جميع البيانات من الملف في الجدول. يمكن تحديث ملف الخصائص. لذلك ، أريد الاستماع إلى هذا الملف. أستمع إلى كائن باستخدام PropertyChangesupport و PropertyChangelistener.

updatedStatus = new basit.data.MyString();
    updatedStatus.addPropertyChangeListener(new java.beans.PropertyChangeListener() {

        //After changes "i", we inform the table model about new value
            public void propertyChange(PropertyChangeEvent evt) {
                Object objec=evt.getNewValue();
                tableModel.setValueAt(objec.toString(), 0, 5);
            }
        });

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

updatedStatus.setValue(resourceMap.getString("HDI.Device.1.Name"));

حاولت استخدام StringBuffer ، لكنني لم أستطع تحقيق ذلك. لهذا السبب ، طرحت السؤال.

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

المحلول

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

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

يجب أن تستمع إلى التغييرات في الملف (أو استطلاعه) وإعادة تحميل الملف (إما إلى جديد Properties أو الكتابة فوقها الحالية) في تلك المرحلة. تماما سواء كنت ايضا تحتاج إلى الاستماع للحصول على تحديثات على حاوية السلسلة سوف تعتمد على التطبيق الخاص بك.

نصائح أخرى

يمكننا الحصول على عنوان كائن في الذاكرة. حسنا كيف؟ إنه هكذا ؛

باستخدام sun.misc.unsafe فئة في جافا.

إنشاء كائن جديد غير آمن واستخدم getAddress(Object); ؛ الطريقة وسيعود قيمة طويلة هي العنوان.

وأيضا هناك العديد من الطرق لهذه الفئة.

يمكنك تغيير القيم في هذا العنوان باستخدام putInt(Object,long offset, int value) أو مثل هذه الطريقة. (الحصول على بعض القيمة getnt(Object)).

ملاحظة: هذا الفصل حقًا غير آمن . إذا قمت بعمل أشياء خاطئة في مشروعك ، JVM سيتم إيقافها.

System.identityHashCode(obj) يوفر أفضل شيء التالي: رقم فريد لكل كائن. وهو يتوافق مع الافتراضي Object.hashCode() التنفيذ.

على حد تعبير API: "بقدر ما هو عملي بشكل معقول ، فإن طريقة HashCode المحددة بواسطة كائن الفئة تعيد أعداد صحيحة مميزة للكائنات المميزة (يتم تنفيذ هذا عادة عن طريق تحويل العنوان الداخلي للكائن إلى عدد صحيح ، ولكن تقنية التنفيذ هذه هي غير مطلوب من قبل لغة البرمجة javatm.) ".

انظر إلى تكوين Apache Commons. هذه المكتبة لديها دعم لإعادة التحميل الديناميكي لملفات الخصائص (على سبيل المثال). يرى هنا.

أفضل طريقة لمراقبة ما إذا كانت بعض تغييرات الملف هي IMHO لجعل قيمة التجزئة مع SHA1 أو MDA5 وحفظ القيمة في ذاكرة التخزين المؤقت. وتصنع موضوعًا كل دقيقة ، ثوانٍ ، يعتمد على عدد مرات مشاهدة الملفات ، وجعل قيمة التجزئة على الملف. بحيث يمكنك مقارنة هذه القيمتين وإذا كانت القيم غير مكافئة حتى تتمكن من إعادة تحميل الملف الجديد.

Java ليس مثل C/C ++. في C ++ ، ستعمل في كثير من الأحيان مع العنوان (هذا المبرمج C ++ لديه مؤشر استدعاء مفهوم). لكنني أخشى أن لا في جافا. جافا آمنة للغاية تمنعك من لمس عنوانها.

ولكن ، هناك طرق أخرى ربما مع فكرتك هي استخدام Hashcode. Hashcode لقاعدة الكائن على عنوانها على كومة.

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