تصف هذه المقالة استخدام آلية انعكاس برمجة Java. شاركه للرجوع إليه ، على النحو التالي:
مقدمة: الانعكاس: الحصول على فئة ديناميكية (ملف Bytecode مثل profire.class في هذه المقالة) وتشغيل أعضائه. قد يكون الانعكاس أقل بقليل في تطوير طبقة تطبيق Android ، ولكن بالنسبة لأولئك الذين يرغبون في الوصول إلى الطبقة الأساسية ، يجب أن يكونوا بارعين في استخدامه.
فئة الكيان
شخص
حزمة com.sunwenou.reflect ؛ // اسم الحزمة اسم الفئة العامة {اسم السلسلة الخاصة ؛ عصر INT الخاص ؛ public person () {// no parameter} public profere (اسم السلسلة ، int age) {// with parameter super () ؛ this.name = name ؛ this.age = العمر ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } public int getage () {return Age ؛ } public void setage (int age) {this.age = age ؛ } Override Public String ToString () {return name+"،"+Age ؛ } public void show () {// fmare parameter system.out.println ("show") ؛ } public void fun (String ss) {// with parameter system.out.println (ss) ؛ } public static void function () {// static system.out.println ("static") ؛ }}طرق للحصول على ملفات Bytecode ديناميكيًا
من أجل جعل منشور المدونة يبدو موجزًا ، يتم إلقاء استثناء ويتم حذف الاستيراد ، وهو نفسه أدناه.
package com.sunwenou.reflect ؛ طريقة الفئة العامة demo1 { /**** طريقة للحصول على ملفات bytecode ديناميكيًا* 1: استخدم طريقة getClass () الفئة المقدمة من فئة الكائن* تتطلب هذه الطريقة كائنات* 2: كل نوع من البيانات يحتوي على سمة فئة ثابتة ، ونوع البيانات المُعاد بواسطة هذه السمة. هناك حاجة إلى السلسلة ، والتي تتكون من اسم الحزمة + اسم الفئة*/public static void main (string [] args) resword {// getClaz () ؛ // getCalz2 () ؛ getClaz3 () ؛ } // استخدم طريقة forname () التي توفرها الفئة العامة الثابتة getClaz3 () رمي الاستثناء {class <؟> claz = class.forname ("com.sunwenou.reflect.person") ؛ class <؟> claz2 = class.forname ("com.sunwenou.reflect.person") ؛ System.out.println (Claz == Claz2) ؛ } // لكل نوع بيانات لديه سمة فئة ثابتة عامة فاخرة ثابتة getCalz2 () {class <Phone> p1 = person.class ؛ فئة <Person> p2 = person.class ؛ system.out.println (p1 == p2) ؛ } // استخدم طريقة getClass () الفئة المقدمة من فئة الكائن الفئة العامة الثابتة getClaz () {person person1 = new person () ؛ الفئة <؟ يمتد الشخص> claz = person1.getClass () ؛ // person.class person 2 = new person () ؛ الفئة <؟ يمتد الشخص> claz2 = person2.getClass () ؛ // person.class system.out.println (claz == claz2) ؛ }}احصل على الفئة ديناميكيًا وإنشاء الكائن
Package com.sunwenou.reflect ؛ public class demo2 {public static void main (string [] args) rems {// createObj () ؛ creatoBj2 () ؛ } public static void createObj2 () يلقي الاستثناء {// person person = شخص جديد ("Lisi" ، 23) ؛ // احصل على فئة كائن ملف bytecode <؟> claz = class.forname ("com.sunwenou.reflect.person") ؛ //person.class // احصل على كائن من النوع الذي تنتمي إليه طريقة المنشئ مع المعلمات. مُنشئ المنشئ = claz.getConstructor (string.class ، int.class) ؛ // قم بإنشاء الكائن باستخدام طريقة إنشاء كائن يوفره شخص فئة المنشئ الشخص = (الشخص) constructor.newinstance ("Lisi" ، 23) ؛ system.out.println (شخص) ؛ } public static void createObj () يلقي استثناء {// person = شخص جديد () ؛ // احصل على فئة كائن ملف bytecode <؟> claz = class.forname ("com.sunwenou.reflect.person") ؛ Object obj = claz.newinstance () ؛ // بشكل افتراضي ، استخدم مُنشئ المعلمات الفارغة لإنشاء system.out.println (OBJ) ؛ }}احصل ديناميكيًا على الفصل وتعيين القيم لمتغيرات الأعضاء
Package com.sunwenou.reflect ؛ demo3 {public static void main (string [] args) يرمي الاستثناء {// person p = new person () ؛ //p.name = "lisi" ؛ // احصل على فئة كائن ملف bytecode <؟> claz = class.forname ("com.sunwenou.reflect.person") ؛ // احصل على كائن نوع الحقل الذي ينتمي إليه متغير العضو//حقل الحقل = claz.getfield ("name") ؛ // احصل على العضو مع حقل الإذن العام = claz.getDeclaredField ("name") ؛ // الحصول على جميع الحقول المعلنة system.out.println (الحقل) ؛ . Field.SetAccessible (true) ؛ // cracking force brute ، تم تعيينه على حقل يمكن الوصول إليه (OBJ ، "Zhang San") ؛ System.out.println (OBJ) ؛ }}احصل على الفصل بشكل ديناميكي وتنفيذ الطريقة
Package com.sunwenou.reflect ؛ demo4 {public static void main (string [] args) يرمي الاستثناء {// method1 () ؛ method2 () ؛ الطريقة 3 () ؛ } إلقاء Method3 () static void method3 () استثناء {// احصل على فئة كائن ملف bytecode <؟> claz = class.forname ("com.sunwenou.reflect.person") ؛ الطريقة m = claz.getMethod ("وظيفة" ، خالية) ؛ M.Invoke (NULL ، NULL) ؛ } ///// تنفيذ الطريقة باستخدام المعلمات public static void method2 () يلقي الاستثناء {// الحصول على فئة كائن ملف bytecode <؟> claz = class.forname ("com.sunwenou.reflect.person") ؛ الطريقة m = claz.getMethod ("متعة" ، string.class) ؛ كائن obj = claz.newinstance () ؛ M.Invoke (OBJ ، "Hello") ؛ } // تنفيذ الطريقة بدون معلمات method static static method1 () رمي الاستثناء {// person person = new person () ؛ person.show () ؛ // احصل على فئة كائن ملف bytecode <؟> claz = class.forname ("com.sunwenou.reflect.person") ؛ // احصل على كائن ملف bytecode الذي تنتمي إليه الطريقة التي تم تنفيذه. الطريقة m = claz.getMethod ("show" ، null) ؛ // الأساليب غير القتالية تعتمد على الكائن obj = claz.newinstance () ؛ // تنفيذ طريقة M.Invoke (OBJ ، NULL) ؛ }}هذا هو الاستخدام الأساسي للانعكاس. يمكننا إنشاء كائنات من خلال ملف Bytecode للكائن عندما لا نستطيع إنشاء كائنات بشكل طبيعي وتنفيذها. هل تعلمت كيف تفعل ذلك؟ ؟
لمزيد من المعلومات حول المحتوى المتعلق بـ Java ، يرجى مراجعة موضوعات هذا الموقع: "مقدمة والتعليمي المتقدم حول البرمجة الموجهة نحو كائن Java" ، "تعليمي حول بنية بيانات Java والخوارزمية" ، "ملخص لمهارات تشغيل Java Operation" ، "ملخص لمهارات تشغيل Java ومهارات تشغيل الدليل" ملخص من Java Cache "المهارات".
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.