فئة الحقل
تحدد فئة الحقل بعض الطرق التي يمكن استخدامها للاستعلام عن نوع الحقل وضبط أو قراءة قيمة الحقل. يتيح لنا الجمع بين هذه الأساليب مع طريقة العضو الموروثة معرفة جميع المعلومات حول إعلان الحقل وأن نكون قادرين على معالجة الحقول لكائن أو فئة معينة.
تقوم طريقة getGenericType بإرجاع مثيل نوع يمثل نوع الإعلان للحقل. بالنسبة للأنواع التافهة مثل String أو int ، تقوم الطريقة بإرجاع كائن الفئة المرتبط به ، مثل string.class و int.classo لأنواع معلمة مثل القائمة <stri ng> ، تقوم الطريقة بإرجاع مثيل من المعلمة ، على سبيل المثال ، لنوع مثل t ، تقوم الطريقة بإرجاع مثيل typevariable.
ستعيد طريقة GetType القديمة كائن فئة من نوع الحقل. بالنسبة للأنواع التافهة ، تتصرف الطريقة مثل طريقة getGenericType. إذا كان النوع المعلن للحقل هو نوع محدد ، فستقوم طريقة gettype بإرجاع كائن الفئة المقابل لمحو النوع المعلمات ، أي كائن الفئة من النوع الأصلي. على سبيل المثال ، بالنسبة للكائن الذي تم إعلانه كقائمة <stri ng> ، ستعيد Gettype فئة Li St. إذا كان النوع المعلن للحقل هو متغير من النوع ، فستقوم طريقة gettype بإرجاع كائن الفئة المقابل لمحو نوع المتغير. على سبيل المثال ، لنفترض أن هناك فئة foo <ding> ، وبالنسبة للحقول المعلنة كنوع t ، سيعود Getding YPE إلى كائن.
كائن فئة. إذا تم الإعلان عن FOO على أنه FOO <تمديد الرقم> ، فسيتم إرجاع ype under get number.class.
يمكننا استخدام طريقة isenumConstant للاستعلام عما إذا كان الحقل ثابتًا التعداد ، أو يمكننا استخدام طرق Get وضبطها للحصول على قيمة الحقل وتعيينه. هذه الطرق التي تقبل استشهادات الكائنات وإرجاع قيمة ECT لها نموذج مشترك ، وكذلك بعض النماذج الأكثر تخصصًا التي يمكن أن تتعامل مباشرة مع الأنواع الأساسية. كل هذه الأساليب تقبل اقتباس لتحديد الكائن الذي سيتم تشغيله. بالنسبة للحقول الثابتة ، سيتم تجاهل اقتباس الكائن هذا ، بحيث يمكنك أيضًا تعيينه
ضبط على فارغ. ستطبع الطريقة التالية قيمة الحقل القصير للكائن:
Public Static Void printshortfield (كائن O ، اسم السلسلة) يلقي NosuchfieldException ، inclugalAccessException {field field = o.getClass (). getField (name) ؛ القيمة القصيرة = (قصيرة) حقل (O) ؛ System.out.println (value) ؛يمكن أن تكون قيمة إرجاع طريقة GET أي كائن يشير إليه هذا الحقل. إذا كان الحقل نوعًا بدائيًا ، فستقوم الطريقة بإرجاع النوع المناسب من كائن فئة Wrapper. في حقل "نوع Hort-type الخاص بنا ، تقوم طريقة GET بإرجاع كائن من النوع القصير الذي يحتوي على قيمة الحقل ، وعند تعيينه إلى القيمة المتغيرة المحلية ، سيتم إلغاء تثبيت قيمة الكائن تلقائيًا.
استخدام طريقة المجموعة مشابه. قد تبدو طريقة تعيين الحقل القصير على القيمة المقدمة مثل هذا:
STATIC VOI SetShortfield (كائن O ، اسم السلسلة ، NV القصير) يلقي NosuchfieldException ، حقل الحقل غير الشرعي غير الشرعي = 0.GetClass (). getField (name) ؛ الحقل .set (o .nv) ؛
على الرغم من أن SET تقبل معلمات نوع الكائن ، إلا أنه يمكننا تمرير قيمة قصيرة مباشرة ولفها في كائن قصير مع تحويل التفاف.
في الطريقة المذكورة أعلاه ، إذا كان مجال الكائن المحدد يمكن الوصول إليه وتم تطبيق التحكم في الوصول هذا ، فسيتم إلقاء استثناء غير قانوني. إذا كان الكائن الذي تم تمريره يختلف عن نوع المجال ، فسيتم طرح استثناء غير قانوني. إذا كان المجال غير منتظم وكان مرجع الكائن الذي تم تمريره فارغًا ، فسيتم طرح استثناء NullPointerException ؛ قد يتطلب الوصول إلى مجال ثابت تهيئة الفصل ، وبالتالي فإن الطريقة ستعمل أيضًا على استثناء استثناء inializererror.
لدى فئة الحقل أيضًا طرقًا محددة للحصول على الأنواع الأساسية وتحديدها. على سبيل المثال ، يمكننا استدعاء getPrimitive7ype وضبط primitive7ype على كائن الحقل ، حيث يكون primitive7ype اسم النوع الأساسي (الرئامي). يمكن استخدام طريقة الحصول على البيان التالي:
القيمة القصيرة = field.getShhort (O) ؛
يمكن استخدام طريقة SET في العبارة التالية:
field.setshort (o ، nv) ؛
يمكن تجنب استخدام كائنات من النوع الغلاف في البيانات التي تم الإعلان عنها بطريقتين أعلاه.
تنفذ فئة الحقل واجهة المشروح ، بحيث يمكننا أيضًا الاستعلام وتطبيقها على المجال مثل القسم 16.2.
ملاحظات على.
مع الطريقة الموضحة أعلاه ، يمكننا استخدام كائن الحقل كوسيلة لمعالجة أي قيمة ، ولكن يجب أن نحاول تجنبها. نظرًا لأن لغة Java تلتقط أخطاء البرمجة قدر الإمكان خلال فترة التجميع للبرنامج ، يتم استخدام الأساليب غير المباشرة أقل مثل "كائنات IELD" عندما نكتب رمزًا ، وكلما تم منع المزيد من الأخطاء قبل تجميعها في رمز. علاوة على ذلك ، يمكننا أن نرى أنه في الكود السابق ، من أجل معرفة ما الذي سيحدث بالضبط ، من الواضح أننا أنفقنا الكثير من الطاقة في قراءة التعليمات البرمجية أكثر من استخدام أسماء النطاق مباشرة في بناء الجملة العادي.
الحقول النهائية
عادةً ما يؤدي وضع حقل إعلان إلى إلقاء نظرة غير قانونية
استثناء ، هذا ما يمكن أن نتوقعه ، لأن قيمة الحقل النهائي لن تتغير أبدًا. ولكن هناك بعض الحالات الخاصة - على سبيل المثال ، في التخلص من التخلص المخصص (انظر القسم 20.8.4) ، من المنطقي تغيير قيمة الحقل النهائي ، والتي لا يمكننا تحقيقها إلا من خلال التفكير في حقل المثيل ، وفقط إذا تم استدعاء SetAccable (صحيح) في كائن الحقل. لاحظ أنه لا يكفي استدعاء SetAccable (صحيح) بنجاح ويجب أن يطلق عليه بالفعل.
يتم توفير هذه القدرة على السياقات المتخصصة للغاية وليست لغرض عام ، ونحن نقدمها للحفاظ على سلامة المحتوى فقط. إذا كنت خارج سياق محدد ، مثل التخلص من التخصيص المخصص ، فإن تغيير قيمة الحقل النهائي يمكن أن يؤدي إلى عواقب غير متوقعة أو حتى كارثية. خارج هذه السياقات ، ليس هناك ما يضمن أن التغييرات في الحقل النهائي واضحة. حتى في مثل هذه السياقات ، من الضروري التأكد من أن آلية الأمان لا تعيق تنفيذ الكود عند الترميز باستخدام هذه التكنولوجيا. سيجعل تغيير الحقل النهائي بقيمة متغير ثابت (انظر القسم 2.2.3) هذا التغيير غير مرئي ما لم يتم تحقيق هذا التعديل باستخدام الانعكاس.
طريقة فئة
تتيح لنا فئة الطريقة وطرقها الموروثة من فئة الأعضاء الحصول على المعلومات الكاملة حول إعلان الطريقة:
"النوع العام getGenericReturnTypeo: هذه الطريقة تُرجع كائن نوع من نوع الإرجاع للطريقة الهدف. إذا تم إعلان طريقة الهدف لإرجاع باطل ، فإن الطريقة تُرجع void.classo
"النوع العام [] getGenericParameterTypes (): تُرجع هذه الطريقة مجموعة من كائنات النوع لجميع أنواع المعلمات من الطريقة المستهدفة ، والتي سيتم تخزينها في الصفيف بترتيب إعلان المعلمات. إذا لم يكن للطريقة المستهدفة أي معلمات ، فإن الطريقة تُرجع صفيفًا فارغًا.
.Public IC Type [] GetGeneri cacheti ontypes Q: هذه الطريقة تُرجع مجموعة من كائنات النوع من جميع أنواع الاستثناءات المدرجة في جملة TROWS ، والتي سيتم تخزينها في الصفيف بترتيب إعلان الاستثناء.
إذا لم تعلن الطريقة المستهدفة أي استثناءات ، فإن الطريقة تُرجع مجموعة فارغة.
يوفر Java أيضًا طرق GetReturnType و GetParameterTypes و GetExceptionTypes لإرجاع CL ككائن بدلاً من كائن الكتابة. تمامًا مثل استخدام Field.GetType ، يتم تمثيل متغيرات النوع والنوع المعلمة بواسطة كائن الفئة المقابل لمحوها.
تنفذ فئة الطريقة المشروح ، ويمكننا الاستعلام عن التعليقات التوضيحية المطبقة على الطريقة كما تمت مناقشتها في القسم 16.2. بالإضافة إلى ذلك ، توفر فئة الطريقة أيضًا getParameterannotations لتوفير الوصول إلى التعليقات التوضيحية المطبقة على معلمات الطريقة. يمكن أن تُرجع طريقة getParametRannotations صفيف شرح ، حيث يتوافق كل عنصر من عناصر الصفيف الخارجي مع معلمات الطريقة ؛ إذا لم يكن لدى المعلمة أي تعليقات توضيحية ، فإن الطريقة تُرجع مجموعة شرح من الطول 0 لهذه المعلمة. إذا كانت الطريقة التي يمثلها كائن الطريقة هي نفسها عنصر شرح ، فإن طريقة getDefaultValue ستعيد كائن كائن يمثل القيمة الافتراضية للعنصر ؛ إذا لم يكن كائن الطريقة نفسه عنصرًا توضيحيًا أو لا يحتوي على قيمة افتراضية ، فسيتم إرجاع الطريقة Null.Method أيضًا تنفذ GenericDeclaration ، وبالتالي يتم تعريف طريقة getTypeparameters ، والتي ستعود مجموعة من الأشياء typevarable. إذا كان كائن الطريقة المحددة لا يمثل طريقة عامة ، فإن الطريقة تُرجع صفيفًا فارغًا.
يمكننا استخدام طريقة isVarArgs للتحقق مما إذا كان كائن الطريقة هو طريقة فهرس متغيرة ، ويمكن استخدام طريقة i sbridge للتحقق مما إذا كانت طريقة جسر
الطريقة الأكثر إثارة للاهتمام لاستخدام كائن الطريقة هي استدعاء نفسه بشكل عكسي:
. بالنسبة للطرق غير الستراتية ، يحدد النوع الفعلي لهذا onThis تنفيذ الطريقة التي يجب استدعاؤها ، بينما يتم تجاهلها للطرق الثابتة ، وعادة ما يتم تجاهلها وعادة ما يتم ضبطها على Null. يجب أن يكون عدد قيم args هو نفسه العدد الفعلي للمعلمات للطريقة المدعوفة ، ويجب تعيين أنواع هذه القيم جميعها وفقًا لمعلمات الطريقة المدعومة ؛ خلاف ذلك ، سوف نحصل على استثناء LlegalargumentException. لاحظ أن المعلمة الأخيرة من طريقة الاقتباس المتغير هي صفيف ، لذلك يتعين علينا ملء المصفوفة مع الاستشهادات "القابلة للتغيير" التي نريد بالفعل تمريرها. إذا أردنا أن ندعو طريقة لا يمكننا الوصول إليها ، فسترمي الطريقة استثناء غير قانوني. إذا لم تكن الطريقة المسمى هي طريقة ON Object ، فسترمي الطريقة llegalargumentexcepti على الاستثناء. إذا كان هذا لا ، فهذا لا فارغ ، فسيتم إلقاء الطريقة على استثناء 1 pointerxception. إذا كان كائن الطريقة يمثل طريقة ثابتة والفئة التي تعلن عن أن الطريقة الثابتة لا تزال في الحالة المراد تهيئتها ، فسترمي الطريقة استثناء استثناء من العمال nitializererror. إذا كانت الطريقة المدعومة لها قوة غريبة ، فسيتم إلقاء استثناء InvocationTargetException.
عندما نستخدم طريقة الاستدعاء ، يمكننا تمرير النوع الأساسي مباشرة ، أو يمكننا استخدام فئة غلاف مناسبة. يجب تعيين النوع الذي يمثله فئة Wrapper لنوع المعلمة المعلن عن الطريقة. يمكننا استخدام الطويل أو التعويم أو المزدوج لالتفاف الاستشهادات من النوع المزدوج ، لكن لا يمكننا استخدام مزدوج للالتفاف الطويل أو الاستشهادات من النوع العائم ، لأنه لا يمكن تعيين مزدوج إلى الشوفان طويلًا أو الشوفان. طريقة المعالجة للكائن الذي تم إرجاعه بواسطة طريقة Invoke هي نفس الحقل. Get ، الذي يرجع النوع الأساسي لفئة Wrapper المقابلة لهم. إذا تم الإعلان عن الطريقة الفراغ ، فستعود طريقة الاستدعاء الخالية ،
ببساطة ، عندما نستخدم استدعاء أساليب الاتصال ، لا يمكننا إلا استخدام المعلمات القانونية بلغة Java.
الأولويات مع نفس النوع والقيمة. على سبيل المثال ، المكالمة التالية
إرجاع str.indexof ("." ، 8) ؛يمكن كتابته في النموذج التالي باستخدام الانعكاس:
رمي FAS. حاول {method indexm = string.class. getMethod ("index0f" ، string.class ، int.class) ؛ إرجاع (عدد صحيح) indexm.invoke (str ، "،" ، 8) ؛ } catch (nosuchmethodexception e) {failure = e ؛ } catch (invocationTargetException e) {fas = e .getCause () ؛ } catch (alfictAccessException e) {failure = e ؛ } رمي fas ؛على الرغم من أنه لا يمكن تنفيذ عمليات التحقق من الأمان للمترجم للمكالمات المباشرة إلا عند استخدام استدعاء وقت التشغيل عند استخدام التفكير ، إلا أن الكود المستند إلى الانعكاس يحتوي على اختبارات أمان مكافئة بشكل دلالي للرمز المباشر. قد يتم إجراء اختبارات الوصول بطريقة مختلفة قليلاً - يجوز لمدير الأمان رفض الوصول إلى طريقة في الحزمة الخاصة بنا ، حتى لو استطعنا الاتصال بها مباشرة.
عندما نتمكن من استخدام هذا النموذج من المكالمة ، لدينا سبب وجيه لتجنب ذلك. ولكن سيكون من المنطقي إذا استخدمنا طريقة الاستدعاء أو الحصول على/تعيين عند كتابة مصحح تصحيح أو تطبيق عام آخر يحتاج إلى تفسير مدخلات المستخدم كعملية على الكائنات. يمكن استخدام كائن الطريقة إلى حد ما كمؤشر طريقة مشابه لتلك في اللغات الأخرى ، ولكن لدينا أدوات أفضل ، وخاصة الواجهات ، والفصول المجردة ، والفصول المتداخلة ، والتي يمكن استخدامها للتعامل مع المشكلات التي يتم حلها عادة مع مؤشرات الطريقة بلغات أخرى.