آلية انعكاس Java في حالة الجري. تسمى طريقة الكائن آلية الانعكاس للغة جافا. تم اقتراح مفهوم الانعكاس لأول مرة من قبل سميث في عام 1982 ، ويشير بشكل أساسي إلى القدرة على أن يتمكن البرنامج من الوصول إلى حالته أو سلوكه. أدى اقتراح هذا المفهوم بسرعة إلى البحث عن الانعكاس التطبيقي في مجال علوم الكمبيوتر. تم تبنيه لأول مرة في مجال تصميم لغة البرمجة وحققت الإنجازات في LISP والموجهة نحو الكائن. بالطبع ، ليس مفهومًا جديدًا.
توفر آلية انعكاس Java الاستخدامات التالية بشكل أساسي:
حدد الفصل الذي ينتمي إليه أي كائن في وقت التشغيل
بناء كائنات من أي فئة في وقت التشغيل
تحديد متغيرات الأعضاء وطرق أي فئة في وقت التشغيل
أساليب استدعاء أي كائن في وقت التشغيل
أولاً ، دعونا نلقي نظرة على مثال بسيط ، ونستخدم هذا المثال لفهم كيفية عمل آلية انعكاس Java.
Package com.wanggc.reflection ؛ استيراد java.lang.reflect.method ؛/*** تمارين انعكاس Java. * * Author Wanggc * /Public Class Fornametest { /** * وظيفة الإدخال. * * param args * parameters * therws استثناء * رسالة خطأ */ public static void main (string [] args) reversion {// get class class <؟> cls = class.fornam e (args [0]) ؛ / الحصول على الكائن المقابل من خلال طريقة الفئة [] Cls.getMethods () ؛عندما تكون المعلمة التي تم تمريرها هي java.lang.string ، سيتم إخراج النتيجة التالية
منطقية عامة java.lang.string.equals (java.lang.object) العامة java.lang.string . int) public int java.lang.string.indexof (java.lang.string) public int java.lang.string.indexof (java.lang.string ، int) (int) public static java.lang.string java.lang.string.valueof (char) public static java.lang.string java.lang.string java.lang.string.valueof (float) java.lang.string java.lang.string.valueof (char [] ، int ، int) java.lang.string java.lang.string.valueof (double) Public S Tatic Java.lang.String Java .Lang.String.Valueof (char []) java.lang.string java.lang.string.valueof (java.lang.object) java.lang.string java. Lang.String. str ing.codepointcount (int ، int) public int java.lang.string.comparetoignorecase (java.lang.string) java.lang.string java.lang.string.concat (java.lang.string) public boolean.lang .string. contains (java.lang.charequence) boolean java.lang.string.contentequals (java.lang.charequence) boolean boolean java.lang.string.contentequals (java.lang.stringbuffer) stati c java.lang. String java.lang.string.copyvalueof (char []) java.lang.string java.lang.string.copyvalueof (char [] ، int ، int) boolean java.lang.string.endswith (java.lang. سلسلة) Boolean Java.lang.String.equalsignorecase (java.lang.string) java.lang.string java.lang.string.format .lang.String java.lang.st ring.format (java.util.locale ، java.lang.string ، java.lang.object []) public byte [] java.lang.string.getbytes (java.lang.string ) رمي java.io.unsupportedenc oddexceptionpublic java.lang. getBytes (java.nio.charset.char) public void java .lang.string.getchars (int ، int ، char [] ، int) .lang.string.isempty () public int j ava.lang. ) public int java.lan g.string.lastindexof (java.lang. string ، int) public int java.lang.tring.length () public boolean java.lang.string.matches .lang.string.offsetbycodepoin ts (int ، int) java.lang public boolean. java.lang.string ، int ، int) java.lan g.string java.lang .string.replace (java.lang.charevence ، java.lang.charequence) (char ، char) public java.lang.string java .lang.string.replaceall (java .lang.string ، java.lang.string) java.lang.string java.lang.string.replacefirst (java.lang.string ، java.lang.string) public java.lang.string [] Java.Lan G.String .Split (java.lang.string) java.lang.string [] java.lang.string.split (java.lang. String ، int) public boolean java.lang.string.startswith (java.lang.st ring) public boolean .Subequence (int ، int) public java.lang.string j ava.lang.string.substring (int) public java.lang.string java.lang.string.substring (int ، int) char public [] java.lang. String.Tocharray () public java.lang.string java.lang.string.tolow ercase () .string java.lang.string.touppercase () public java.lang.string void java.lang.object.wait (long) رمي java.lang.InterruptedExceptionpub lic void النهائي java.lang.object java.lang.cla java.lang.InterruptedExceptionpublic.
هذا يسرد جميع أسماء الأسلوب ، وأحرفها المحددة ، وأنواع الإرجاع والاستثناءات التي تم إلقاؤها لفئة java.lang.string. يستخدم هذا البرنامج طريقة فئة الفئة ForName لتحميل الفئة المحددة ، ثم يستدعي طريقة GetMethods لإرجاع قائمة الطريقة للفئة المحددة. يتم استخدام java.lang.reflect.method للتعبير عن طريقة واحدة في فئة معينة.
يتطلب استخدام آلية انعكاس Java بشكل عام ثلاث خطوات:
الحصول على كائن الفئة الذي تريد تشغيل الفصل من خلال كائن الفئة الذي تم الحصول عليه في الخطوة الأولى للحصول على طريقة الفئة أو الطريقة أو السمة التي تم الحصول عليها في الخطوة الثانية من تشغيل اسم الفئة.
عند تشغيل Java ، بغض النظر عن عدد الكائنات التي يتم إنشاؤها فئة معينة ، فإنها ستتوافق مع نفس كائن الفئة ، والذي يمثل الفئة والواجهة في برنامج التشغيل. هناك ثلاث طرق شائعة للحصول على كائنات فئة لفئة العملية:
استدعاء الطريقة الثابتة لفئة الاتصال ، كما هو موضح في المثال أعلاه ؛
استخدم بناء الجملة .class للفئة ، مثل: class <؟> cls = string.class ؛
استدعاء طريقة getClass للكائن ، مثل: String str = "ABC" ؛
سيستخدم ما يلي مثالًا لوصف كيفية تنفيذ طريقة معينة لكائن من خلال الخطوات الثلاث المذكورة أعلاه:
حزمة com.wanggc.reflection ؛ * * Author Wanggc */ public class reflectest {public static void main (string [] احصل على طريقة العرض من خلال طريقة الفئة = cls.getmethod ("show" ، string.class) ؛ void show (اسم السلسلة) {system.out.println ("Hello:" + name) ؛كما ذكرنا سابقًا ، سيكون لكل فئة من برنامج Java كائن فئة يتوافق معه. تتمثل الخطوة الأولى في انعكاس Java في الحصول على كائن الفئة هذا ، مثل 14 سطرًا من التعليمات البرمجية. بالطبع ، يجب أن تحتوي طريقة كل فئة أيضًا على كائن الطريقة المقابل له. لاستدعاء هذه الطريقة من خلال الانعكاس ، يجب أولاً الحصول على كائن الطريقة لهذه الطريقة ، مثل السطر 16 من الكود ، ثم استخدام كائن الطريقة لاستدعاء هذه الطريقة بدوره ، مثل السطر 18 من الكود. لاحظ أن المعلمة الأولى لطريقة getMethod في السطر 16 هي اسم الطريقة ، والثاني هو نوع المعلمة لهذه الطريقة. تنفيذ طريقة الاستدعاء لـ 18 سطرًا من الكود ، وهي في الواقع طريقة العرض المعلمة هي تمريرها إلى طريقة العرض. يجب أن يكون النوع والرقم متسقًا مع طريقة getMethod من 16 سطرًا.
يوضح المثال أعلاه كيفية استدعاء طريقة فئة معينة من خلال الانعكاس.
حزمة com.wanggc.reflection ؛ * * Author Wanggc */ public Class Reflectest {public static void main (string [] args) request {// إنشاء طالب طالب طالب = جديد () ؛ ) + ":" + DESTSTUDENT.GETSTUAGE ()) ؛ * * param من * انسخ كائن المصدر * param dest * انسخ كائن الهدف * athrows استثناء * استثناء */ خاص نسخ باطل ثابت (كائن من ، كائن القدر) يلقي الاستثناء {// احصل على كائن الفئة من النسخة فئة كائن المصدر <؟> من Class = from.getClass () ؛ > destclass = dest.getclass () ؛ اسم الكائن المستهدف = DETC LASS.GETDECLARED (الاسم) ؛ اعتراض على السمة المقابلة للنسخ الهدف الكائن DestField.set (القدر ، من الحقول. ::::::::::::::::::::::::: :::::::::::::::::::::: :::::::::::::::::::::::::::: ::::::::::::::::::: ؛ * / student { / ** name* / private String und ؛ ** regurn اسم الطالب*/ السلسلة العامة getStuname () {return und}/ ** } / *** الحصول على عصر الطالب** RETURN Age* / Public int getStuage () {return stuage ؛ ) {this.stuage = stuage ؛في آلية إطلاق Java ، يتوافق الفصل مع الفصل ، وطرق الفصل تتوافق مع الطريقة ، وبالطبع تتوافق الخصائص أيضًا مع الحقل. تم التعليق على التعليقات في الكود بالتفصيل ولن تتكرر هنا. لكن كن على دراية بأن الحقل يوفر طرقًا وضبطًا للحصول على قيم السمات وضبط شفرة. يمكنك أيضًا تعيين إمكانية الوصول للحقول بأكملها واستخدام الطريقة الثابتة لـ AccessableObject SetAccable تحت 40 سطرًا ، مثل: AccessibleObject.setAccible (FromFields ، True) ؛
يوضح الوصف السابق كيفية استخدام آلية انعكاس Java لتشغيل أساليب وخصائص الفصل.
حزمة com.wanggc.reflection ؛ * * Author Wanggc */ public Class Reflectest {public static void main (string [] args) request {// إنشاء طالب طالب طالب = جديد () ؛ ()) ؛ * * param من * انسخ كائن المصدر * param dest * انسخ كائن الهدف * athrows استثناء * استثناء */ كائن ثابت خاص copybean (كائن من) يلقي استثناء {// احصل على كائن كائن كائن المصدر < ؟> fromClass = from.getClass () () ؛ SET (ints ، fromfield.get (من)) ؛ * / student { / ** name* / private String und ؛ ** regurn اسم الطالب*/ السلسلة العامة getStuname () {return und}/ ** } / *** احصل على عصر الطالب** @عصر العائد* / public int getStuage () ) {this.stuage = stuage ؛نتيجة هذا المثال والمثال السابق هو نفسه. ومع ذلك ، لم يعد الكائن الذي تم إرجاعه بواسطة طريقة النسخة النسبية قد تم تمريره في الخارج ، ولكن يتم إنشاؤه داخليًا بالطريقة ، كما هو موضح في الكود في السطر 40. ملاحظة: يمكن أن تنشئ طريقة Newinstance من الفئة فئات فقط تحتوي على مُنشئين بدون معلمات. Wanggc ") ؛
في هذه المرحلة ، تم تقديم الوظائف الشائعة لآلية انعكاس Java (طريقة استدعاء الكائنات في وقت التشغيل ، واستخدام سمات الفصل ، وإنشاء كائنات الفصل).
الملحق: عند الحصول على الأساليب والخصائص والمقاعد في الفصل ، هناك طريقتان مقابلان: getxxx و getGetDeclaredXXX. الفرق هو أن الأساليب والخصائص السابقة مع حقوق الوصول ، بما في ذلك تلك الموجودة في فئة الوالدين ؛
المحتوى أعلاه هو آلية إطلاق Java المقدمة لك ، أتمنى أن تنال إعجابك.