سؤال

لقد مررت بالبرنامج التعليمي التالي:

http://www.javaworld.com/community/node/2915

وبعد قراءة المقال أعلاه ، أشعر ، أنه لا يمكن كتابة واجهة علامة ، لأنه ، كيف يمكنك توجيه المترجم ، ما هو العلامة ، التي تم تضمينها في ملف .class لواجهة العلامة الخاصة بك.

يرجى تصحيح لي إذا كنت مخطئا. في صحتك :)

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

المحلول

هنا هي العلامة هي رمز عشري hexa ، والذي يتم إضافته إلى ملف .class لتلك الفئة التي تنفذ الواجهة القابلة للتسلسل. لذلك ، يعامل JVM هذا الملف الفئة بطريقة خاصة (قد يكون بعض أعمال تخصيص الموارد الثقيلة) ، لأنه قد يتم تسلسل مثال هذه الفئة. بالنسبة للفصول العادية ، فإنه يضيف CA Fe Hex.

آها !! أنا أفهم ارتباكك.

  • CA FE الرقم السحري لملف bytecode ؛ أي الملف الذي تحصل عليه عند تجميع فصل دراسي. يحتوي ملف Bytecode لأي فصل على هذا الرقم السحري ، سواء كان قابلاً للتسلسل أم غير قابل للتسلسل.

  • AC ED هو الرقم السحري ملف كائن جافا المسلسل ؛ أي الملف الذي تقوم بتسلسله مثيلًا لبعض الفئات القابلة للتسلسل.

أنت تمزج مفهومين مختلفين (الفصول والحالات) وتمثيلهما.

لذا فإن إجابة سؤالك هي ... بالطبع يمكنك كتابة واجهات العلامة الخاصة بك! لا يوجد شيء خاص للمترجم حول فئة تنفذ واجهة علامة.

ومع ذلك ، هو سيكون يكون من المستحيل تكرار تنفيذ هجر جافا كائن في Java النقي. يستخدم هجر الكائن Backdoor ( Unsafe.allocateInstance الطريقة) لإنشاء كائنات دون التذرع بمنشئاتهم. AFAIK ، لا يمكن استدعاء هذه الطريقة من رمز Java العادي. (وحتى لو كان ذلك ممكنًا ، لا ينبغي أن يكون ...)

نصائح أخرى

بالطبع يمكنك كتابة واجهة علامة. واجهة العلامة هي عمومًا مجرد واجهة بدون طرق على الإطلاق (لذلك يمكن لأي فئة تنفيذها).

يبدو أنك تعتقد أن واجهات Marker لديها بعض الخصائص السحرية التي تفعل شيئًا بمفردها. هذا ليس هو الحال. بدلا من ذلك بعض آخر يمكن أن يتفاعل الكود على وجود واجهة علامة على بعض الكائنات ويتصرف بشكل مختلف عندما ينفذها الفصل. لكن واجهة العلامة نفسها لا يفعل أي شيء .

package com.example;
interface MarkerInterface {}

هنا لديك واحد. فقط copypaste in في com/example/MarkerInterface.java, وتجميعها واستخدمها!

إليك مثال على الاستخدام:

class SomeClass implements MarkerInterface {
    // ...
}

لا يمكنك إنشاء واجهة علامة لها معنى لـ JVM ، مثل java.io.Serializable واجهة تفعل. ومع ذلك ، يمكنك إنشاء واجهة علامة تتحقق منها في الكود الخاص بك باستخدام instanceof.

ومع ذلك ، فإن استخدام واجهات العلامات بهذه الطريقة أمر يثبط بشكل عام الآن التعليقات التوضيحية. وضع علامة على أساليب وحقول الطبقة بطرق مختلفة للمعالجة اللاحقة في وقت الترجمة باستخدام أداة معالجة التعليقات التوضيحية (APT) أو في وقت التشغيل باستخدام الانعكاس هو ما تم إنشاؤه التعليقات التوضيحية.

لذا بدلاً من إنشاء واجهة علامة واستخدامها مثل:

class MyClass implements MyMarkerInterface {
}

ربما يجب عليك إنشاء تعليق توضيحي واستخدامه مثل ذلك:

@MyAnnotation
class MyClass {
}

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

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