English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يشرح هذا المقال مثالاً على استخدام ميكانيكية الت反射 في برمجة Java. يشارك الجميع ويقدم لكم كمرجع، مثلما يلي:
المقدمة:الانعكاس: الحصول بشكلديناميكي على الصف (ملف كود البايت مثل Person.class) وتشغيل أعضائه. قد يواجه تطوير تطبيقات Android反射 بشكل أقل قليلاً، ولكن يجب أن يكون لدى الأصدقاء الذين يرغبون في اختراق الأسفل المهارة في التعامل معه.
فئة جسمية
Person.java
package com.sunwenou.reflect;// اسم الحزمة public class Person { private String name; private int age; public Person() {// بدون معامل } public Person(String name, int age) {// يحتوي على معامل super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { 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() { // بدون معامل System.out.println("show"); } public void fun(String ss) { // يحتوي على معامل System.out.println(ss); } public static void function() { // ص静态 System.out.println("static"); } }
طريقة الحصول على ملف الكود النصي المحدد بشكل ديناميكي
في هذا المقال، من أجل جعل المقال يبدو مختصرًا، يتم رمي Exception بشكل عام، وتجاهل import، وما إلى ذلك.
package com.sunwenou.reflect; public class Demo1 { /** * طريقة الحصول على ملف الكود النصي المحدد بشكل ديناميكي * 1:استخدام طريقة getClass() التي يقدمها كلاس Object * هذا الأسلوب يتطلب وجود كائن * 2:لدي كل نوع بيانات خاصية class ثابتة، تُعيد هذه الخاصية ملف الكود النصي المحدد لنوع البيانات * int.class Person.class * 3:استخدام طريقة forName() التي يقدمها Class * يلزم تقديم سلسلة واحدة، هذه السلسلة تتكون من اسم الحزمة + اسم الكلاس */ public static void main(String[] args) throws Exception { //getClaz(); //getCalz2(); getClaz3(); } //استخدام طريقة forName() التي يقدمها Class public static void getClaz3() throws Exception { Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Class<?> claz2 = Class.forName("com.sunwenou.reflect.Person"); System.out.println(claz==claz2); } //للفئات كل نوع من البيانات هناك خاصية class ثابتة public static void getCalz2() { Class<Person> p1 = Person.class; Class<Person> p2 = Person.class; System.out.println(p1==p2); } //استخدام طريقة getClass() التي يقدمها كائن Object public static void getClaz() { Person person1 = new Person(); Class<? extends Person> claz = person1.getClass();//Person.class Person person2 = new Person(); Class<? extends Person> claz2 = person2.getClass();//Person.class System.out.println(claz==claz2); } }
الحصول على الكائن بشكل متغير، وأنشئ كائنًا
package com.sunwenou.reflect; public class Demo2 { public static void main(String[] args) throws Exception { //createObj(); createObj2(); } public static void createObj2() throws Exception { //Person person = new Person("lisi",23); // الحصول على هدف الكود البايتي Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class //الحصول على كائن نوع Constructor ينتمي إلى الطريقة البناءة التي تحتوي على معاملات Constructor constructor = claz.getConstructor(String.class,int.class); //استخدام طريقة إنشاء الكائن التي يقدمها Constructor لإنشاء كائن Person person = (Person)constructor.newInstance("lisi",23); System.out.println(person); } public static void createObj() throws Exception { //Person person = new Person(); // الحصول على هدف الكود البايتي Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Object obj = claz.newInstance(); //استخدام طريقة بناء بلا متغيرات كمعيار System.out.println(obj); } }
استخراج الفئة ديناميكياً وتنفيذ تعيين المتغيرات
package com.sunwenou.reflect; public class Demo3 { public static void main(String[] args) throws Exception { //Person p = new Person(); //p.name = ";lisi;"; // الحصول على هدف الكود البايتي Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); //الحصول على كائن الحقل من نوع Field //Field field = claz.getField("name"); //الحصول على الحقول العامة Field field = claz.getDeclaredField("name"); //الحصول على جميع الحقول المعلنة System.out.println(field); //الم成员 غير ثابتة يعتمد على الكائن Object obj = claz.newInstance(); field.setAccessible(true); //كسر الحماية, ضبط الوصول إلى field.set(obj, ";张三;";) System.out.println(obj); } }
استخراج الفئة ديناميكياً وتنفيذ الطريقة
package com.sunwenou.reflect; public class Demo4 { public static void main(String[] args) throws Exception { //method1(); method2(); method3(); } public static void method3() throws Exception { // الحصول على هدف الكود البايتي Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("function", null); m.invoke(null, null); } ////执行带参数的方法 public static void method2() throws Exception { // الحصول على هدف الكود البايتي Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("fun", String.class); Object obj = claz.newInstance(); m.invoke(obj, ";hello;"; } // تنفيذ الطريقة بدون معاملات public static void method1() throws Exception { // Person person = new Person(); person.show(); // الحصول على هدف الكود البايتي Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); // الحصول على هدف الكود البايتي للطريقة التي سيتم تنفيذها Method m = claz.getMethod("show", null); // الطريقة غير الثابتة تعتمد على الهدف Object obj = claz.newInstance(); // تنفيذ الطريقة m.invoke(obj, null); } }
هذا هو استخدام الت反射 الأساسي، يمكننا إنشاء أهداف من ملف الكود البايتي للهدف عند عدم القدرة على إنشاء الأهداف بشكل طبيعي، وتنفيذ الطرق الموجودة فيها، هل تعلمت ذلك؟؟
يمكن للقراء المهتمين بمزيد من المعلومات حول Java أن يزوروا موضوعات هذا الموقع: 'دليل البدء بتصميم برامج Java' و 'دليل برامج Java للبيانات والخوارزميات' و 'تجميع تقنيات Person.show' و 'تجميع تقنيات Person.show' و 'تجميع تقنيات Person.show' و 'تجميع تقنيات Person.show'.
آمل أن يساعدك ما ذكرته في هذا المقال في تصميم برامج Java.
بيان: محتوى هذا المقال تم جمعه من الإنترنت، ملكية حقوق النشر لأصحابها، تم جمع المحتوى من قبل المستخدمين عبر الإنترنت بشكل متعاوني وتم تحميله بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' ب '@') لإبلاغنا، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، سيتم حذف المحتوى المزعوم عن حقوق النسخ على الفور.