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

استخدام الطريقة والمقابض المتغيرة في Java للوصول إلى الكائنات ومعالجتها في وقت التشغيل

تم النشر بتاريخ 2024-11-02
تصفح:637

Using Method and Variable Handles in Java for Runtime Object Access and Manipulation

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

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

MyClass objectInstance = new MyClass("John Doe");

للوصول إلى الطريقة باستخدام الانعكاس، نحتاج أولاً إلى الحصول على فئة مثيل الكائن الخاص بنا باستخدام طريقة getClass(). بعد ذلك، يمكننا استخدام طريقة getDeclaredMethod() للعثور على الطريقة التي نريد الوصول إليها، في هذه الحالة، "getName". أخيرًا، نحتاج إلى استدعاء الطريقة باستخدام طريقة الاستدعاء () وتمرير مثيل الكائن الخاص بنا. إليك رمز هذه العملية:

Class> clazz = objectInstance.getClass();
Method method = clazz.getDeclaredMethod("getName");
String value = (String) method.invoke(objectInstance);
System.out.println(value); // prints "John Doe"

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

استخدام مقابض الطريقة للوصول إلى طريقة ما يشبه استخدام الانعكاس. نبدأ بالحصول على فئة مثيل الكائن لدينا. بعد ذلك، نستخدم طريقة findVirtual() في MethodHandles للبحث عن الطريقة التي نريد الوصول إليها. بعد ذلك، نستدعي الطريقة باستخدام طريقة الاستدعاء () ونمرر مثيل الكائن الخاص بنا. إليك رمز هذه العملية:

Class> clazz = objectInstance.getClass();
MethodHandle handle = MethodHandles.lookup().findVirtual(clazz, "getName", methodType(String.class));
String value = (String) handle.invoke(objectInstance);
System.out.println(value);  // Prints “John Doe”

ومع ذلك، هناك قيود على ما يمكن أن تفعله مقابض الأساليب. لا يمكنهم التعامل مع مهام مثل إنشاء مثيل للفئات، وهو أمر ممكن مع التفكير.

لعرض قوة مقابض الطريقة، دعونا نلقي نظرة على كيفية استخدامها للوصول مباشرة إلى حقل خاص في الفصل الدراسي. لنفترض أن فئة "MyClass" الخاصة بنا تحتوي على متغير سلسلة خاص يسمى "name". يمكننا استخدام الانعكاس للوصول إليه، ولكن استخدام مقابض الأساليب يعد بديلاً أكثر أمانًا.

للوصول مباشرة إلى حقل خاص باستخدام الانعكاس، نحتاج أولاً إلى الحصول على فئة مثيل الكائن الخاص بنا. بعد ذلك، نستخدم طريقة getDeclaredField() للعثور على الحقل الذي نريد الوصول إليه، في هذه الحالة، "الاسم". ومع ذلك، نظرًا لأن هذا الحقل خاص، فنحن بحاجة إلى استخدام طريقة setAccessible() لتعيين إمكانية الوصول إليه على true. وأخيرًا، يمكننا استخدام طريقة get() لاسترداد قيمة الحقل. إليك رمز هذه العملية:

Class> clazz = objectInstance.getClass(); 
Field field = clazz.getDeclaredField("name"); 
field.setAccessible(true); 
String value = (String) field.get(objectInstance);
System.out.println(value); // prints “John Doe”

باستخدام مقابض الطريقة، تكون العملية مشابهة. نبدأ بالحصول على فئة مثيل الكائن الخاص بنا، ثم نستخدم طريقة PrivateLookupIn() على MethodHandles لاحترام معدّلات الوصول للحقل (نظرًا لأنه خاص). بعد ذلك، نستخدم طريقة findVarHandle() للعثور على الحقل الذي نريد الوصول إليه. وأخيرًا، يمكننا استخدام طريقة get() لاسترداد قيمتها. إليك رمز هذه العملية:

Class> clazz = objectInstance.getClass(); 
VarHandle handle = MethodHandles.privateLookupIn(clazz, MethodHandles.lookup()).findVarHandle(clazz, "name", String.class);
String value = (String) handle.get(objectInstance);
System.out.println(value); // prints “John Doe”

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

أحد قيود مقابض الطريقة هو أنها لا توفر طريقة للتعامل مع الاستثناءات المحددة. تؤدي العمليات المختلفة التي تتم على مقابض الأساليب ومقابض var إلى ظهور استثناءات محددة يجب اكتشافها والإعلان عنها في كود الإنتاج.

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

اختبر أفضل طريقة للدراسة للحصول على شهادة Java مع الخطط الدراسية الخاصة بـ MyExamCloud واستمتع باختبارات التدريب المجانية.

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/myexamcloud/using-method-and-variable-handles-in-java-for-runtime-object-access-and-manipulation-22gn?1 إذا كان هناك أي انتهاك يرجى الاتصال بـ Study_golang @163.comdelete
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3