ClassReflectionDemo
انسخ رمز الكود كما يلي:
انعكاس الحزمة؛
@مهمل
عرض انعكاس الطبقة العامة {
سلسلة خاصة pri_field؛
سلسلة عامة pub_field؛
عرض الانعكاس العام (){}
عرض الانعكاس العام (اسم السلسلة) {}
عرض الانعكاس الخاص (اسم السلسلة، int int1) {}
الفراغ العام ReflectMethod () {}
الفراغ العام ReflectMethod(String str){}
انعكاس الفراغ الخاص (int int1) {}
الطبقة الداخلية_Refection{}
}
اختبار classReflectionDemoTest
انسخ رمز الكود كما يلي:
انعكاس الحزمة؛
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
اختبار الطبقة العامة ReflectionDemoTest {
public static void main(String[] args) {
// أنشئ كائن فئة واستخدم التعديل العام لتجنب النقل القسري
Class cla=ReflectionDemo.class;
// طريقة الحصول على كافة الحقول العامة
Field[] field=cla.getFields();
ل(الحقل و: الحقل){
System.out.println("طريقة الحصول على كافة الحقول العامة:"+f.toString());
}
// طريقة الحصول على مجال عام محدد
يحاول {
الحقل field1=cla.getField("pub_field");
System.out.println("طريقة الحصول على الحقل العام المحدد:"+field1.toString());
} قبض (SecurityException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} التقاط (NoSuchFieldException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
// طريقة الحصول على جميع المجالات (بما في ذلك المجالات الخاصة)، Declare
Field[] field2=cla.getDeclaredFields();
ل(الحقل و:الحقل2){
System.out.println("طريقة الحصول على كافة الحقول (بما في ذلك الحقول الخاصة):"+f.toString());
}
// طريقة الحصول على المجال المحدد (بما في ذلك المجال الخاص)
يحاول {
الحقل field3=cla.getDeclaredField("pri_field");
System.out.println("طريقة الحصول على الحقل المحدد (بما في ذلك الحقل الخاص):"+field3.toString());
} قبض (SecurityException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} التقاط (NoSuchFieldException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
// احصل على جميع الطرق العامة (بما في ذلك الفئات الرئيسية)
الأسلوب[] الأسلوب=cla.getMethods();
ل(الطريقة م: الطريقة){
System.out.println("الحصول على كافة الطرق العامة:"+m.toString());
}
يحاول {
// احصل على الطريقة المحددة بدون معلمات
// تشير المعلمة الثانية إلى نوع المعلمة، وتشير المعلمة NUll إلى الطريقة بدون معلمات.
Method Method1=cla.getMethod("ReflectMethod", null);
System.out.println("احصل على طريقة الطريقة العامة بدون معلمات:"+method1.toString());
} قبض (SecurityException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} التقاط (NoSuchMethodException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
// طريقة الحصول على كافة أساليب هذه الفئة (باستثناء الفئة الأصل)
Method[]method2=cla.getDeclaredMethods();
ل(الطريقة م: الطريقة2){
System.out.println("الحصول على كافة الأساليب (بما في ذلك الفئات الأصلية):"+m.toString());
}
// احصل على طريقة الطريقة المحددة لهذه الفئة (باستثناء الفئة الأصلية)
// المعلمة الأولى هي اسم الطريقة، والمعلمة الثانية هي نوع إرجاع الطريقة، وNULL هي الطريقة بدون معلمات.
يحاول {
Method Method3=cla.getDeclaredMethod("ReflectMethod",int.class);
System.out.println("احصل على طريقة الطريقة المحددة لهذه الفئة (باستثناء الفئة الأصل):"+method3);
} قبض (SecurityException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} التقاط (NoSuchMethodException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
// احصل على المنشئ العام
// احصل على المنشئ العام بدون معلمات
يحاول {
Constructor cs=cla.getConstructor(null);
System.out.println("احصل على المُنشئ بدون معلمات:"+cs);
} قبض (SecurityException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} التقاط (NoSuchMethodException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
// احصل على المنشئ العام مع المعلمات
// إذا كان هناك مُنشئ بمعلمات متعددة، فهناك مُنشئون متعددون. انتبه إلى الترتيب.
يحاول {
Constructor cs=cla.getConstructor(String.class);
System.out.println("احصل على المُنشئ ذو المعلمات:"+cs);
} قبض (SecurityException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
} التقاط (NoSuchMethodException e) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
// احصل على جميع طرق البناء
يحاول {
Constructor[] cs=cla.getDeclaredConstructors();
ل(منشئ ج: خدمات العملاء) {
System.out.println("الحصول على جميع طرق البناء:"+c);
}
} قبض (SecurityException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
// احصل على اسم الحزمة
حزمة الحزمة=cla.getPackage();
System.out.println("احصل على اسم الحزمة الحالية:"+pack);
//احصل على التعليقات
Annotation[] ann=cla.getAnnotations();
ل(التعليق التوضيحي: آن){
System.out.println(an.toString());
}
// احصل على الفصل الأصلي
Class supercla=cla.getSuperclass();
System.out.println(supercla);
// احصل على الطبقة الداخلية
Class[] insidecla=cla.getDeclaredClasses();
ل(الفئة cl:innercla){
System.out.println(cl);
}
}
}
ملخص: خطوات الحصول على معلومات حول كائنات الفئة:
1. إنشاء كائن فئة. الطريقة الأولى Class cla=Class.forName(“PATH”) الطريقة الثانية CLass cla=Instance.getclass();
2. استخدم الحقل والطريقة والمنشئ والحزمة والتعليق التوضيحي للحصول على المعلومات ذات الصلة عن طريق استدعاء الأسلوب cla.getXXXX.
3. تختلف طرق الحصول على الفئات الأصلية والطبقات الداخلية قليلاً.
4. عند استخدام cla.getMethods، يتم استدعاء كافة الأساليب العامة للفئة والفئة الأصل.
5. عند استخدام المُعلن، يتم استدعاء كافة أساليب الفئة، بما في ذلك الأساليب الخاصة. وينطبق الشيء نفسه على المجالات والمنشئات.
6. عندما لا تحتوي فئة الانعكاس على مُنشئ عام ولا يمكنها استخدام طريقة newInstance مباشرةً، فاستخدمها
الطريقة cs=cla.getMethod("getInstance",null);//احصل على الطريقة
Calendar Calendar=(Calendar) cs.invoc(cla, null);// تنفيذ الطريقة التي تم الحصول عليها، المعلمة 1 هي كائن طريقة التنفيذ، المعلمة 2 تمثل معلمات الطريقة
التاريخ df=calendar.getTime();
System.out.println(df.toString());
للحصول على.