أولاً ، دعنا نتعرف على بعض الفئات.
الفصل (java.lang.class)
كائن الفئة هو كائن خاص ، وكل فئة لديها كائن فئة لإنشاء كائن "منتظم" من تلك الفئة. يمكن الحصول عليها من خلال طريقة getClass () للكائن.
على سبيل المثال ، ندير خط الرمز هذا:
نسخة الكود كما يلي:
system.out.println ("test" .getClass (). ToString ()) ؛
النتيجة هي:
نسخة الكود كما يلي:
فئة java.lang.string
الحقل (java.lang.reflect.field)
يمثل هذا الفئة حقلًا يمكن استخدامه للوصول إلى الفصل
بعد ذلك ، دعنا ننشئ فئة الاختبار:
نسخة الكود كما يلي:
كتاب الفئة {
عنوان السلسلة العامة ؛
طول الباحث العام = 0 ؛
ArrayList العامة <Page> صفحات = NULL ؛
@تجاوز
السلسلة العامة tostring () {
سلسلة sb = "book:/n" ؛
sb+= "title ="+title+"/n" ؛
sb + = "length =" + length + "/n" ؛
sb + = "pages =" + pages + "/n" ؛
if (pages! = null) {
لـ (صفحة الصفحة: الصفحات) {
sb += page.toString () ؛
}
}
إرجاع sb.tostring () ؛
}
}
صفحة الفصل {
@تجاوز
السلسلة العامة tostring () {
إرجاع "صفحة/ن" ؛
}
}
استدعاء الطريقة التالية لاختبار الفئة أعلاه:
نسخة الكود كما يلي:
كتاب كتاب = كتاب جديد () ؛
system.out.println (كتاب) ؛
النتيجة هي هذا:
نسخة الكود كما يلي:
كتاب:
العنوان = فارغ
الطول = 0
الصفحات = فارغة
هذه هي الحالة الأولية لكائن الكتاب
نستخدم آلية الانعكاس للحصول على حقل الطول في كائن الكتاب وتعديله لعرض النتائج:
نسخة الكود كما يلي:
كتاب كتاب = كتاب جديد () ؛
فئة <؟> aclass = book.getClass () ؛
حقل الحقل = aclass.getfield ("طول") ؛
field.setint (كتاب ، 9) ؛
system.out.println (كتاب) ؛
يمكنك أن ترى أن نتائج الجري هي:
نسخة الكود كما يلي:
كتاب:
العنوان = فارغ
الطول = 9
الصفحات = فارغة
يمكن ملاحظة أنه تم تعديل قيمة حقل الطول.
تعديل أعلاه هو حقل بسيط من نوع int.
نسخة الكود كما يلي:
كتاب كتاب = كتاب جديد () ؛
فئة <؟> aclass = book.getClass () ؛
الحقل [] الحقول = aclass.getfields () ؛
لـ (حقل الحقل: الحقول) {
Field.SetAccessible (صحيح) ؛
if (field.gettype (). equals (string.class)) {
Field.set (كتاب ، "Grimm's Fairy Tale") ؛
} آخر إذا (field.gettype (). يساوي (int.class)) {
Field.set (Book ، 199) ؛
}
}
system.out.println (كتاب) ؛
نتيجة الإخراج للرمز أعلاه هي:
نسخة الكود كما يلي:
كتاب:
العنوان = حكاية جريم الخيالية
الطول = 199
الصفحات = فارغة
في الواقع ، يتم تعديل جميع مجالات نوع السلسلة إلى "Grimm's Fairy Tale" ويتم تعديل جميع المجالات من نوع Int إلى 199. نحن لا نعرف حتى معنى هذا المجال.
بعد ذلك ، نقوم بتعديل حقل الصفحات. هذا الحقل هو قائمة ArrayList.
نسخة الكود كما يلي:
كتاب كتاب = كتاب جديد () ؛
فئة <؟> aclass = book.getClass () ؛
الحقل [] الحقول = aclass.getfields () ؛
لـ (حقل الحقل: الحقول) {
Field.SetAccessible (صحيح) ؛
if (field.gettype (). equals (ArrayList.Class)) {
String genric = field.getGenericType (). toString () ؛
سلسلة genricclass = genric.substring (
genric.indexof ('<') + 1 ،
genric.indexof ('>')) ؛
الفئة <؟> entityClass = class.forname (genricclass) ؛
Object obj = entityclass.newinstance () ؛
قائمة ArrayList = new ArrayList () ؛
list.add (obj) ؛
field.set (كتاب ، قائمة) ؛
}
}
system.out.println (كتاب) ؛
نتيجة الإخراج على النحو التالي:
نسخة الكود كما يلي:
كتاب:
العنوان = فارغ
الطول = 0
الصفحات = [الصفحة
]
صفحة
يمكن ملاحظة أنه على الرغم من أننا لم نستخدم فئة الصفحة مباشرة ، إلا أننا لا نزال أنشأنا كائن صفحة.
بيان إنشاء كائن الصفحة في الجملة: entityclass.newinstance (). عبارة NewInstance هي وسيلة مهمة لكائن الفئة ويتم استخدامها لإنشاء الكائن المقابل لهذه الفئة. بالطبع ، يدعمه منشئ الفصل. بالإضافة إلى ذلك ، من خلال طريقة GenGenericType ، يمكننا الحصول على معدل المعدل للحقل. ضعها هنا ، ما تحصل عليه هو ArrayList <Page>. باستخدام هذه السلسلة ، يمكننا تحميل فئة الصفحة وإنشاء كائن صفحة من خلال فئة Loader Class.forname.