فحص الفئات باستخدام Reflection
استرجع كائنات Class وافحص الحقول والأساليب والمنشئات والتعليقات التوضيحية أثناء التشغيل
فحص الفئات باستخدام Reflection درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
ما الانعكاس؟
يتيح الانعكاس لبرنامج Java فحص بنيته ومعالجتها أثناء التشغيل — مثل قراءة أسماء الأصناف والحقول والأساليب والمنشئات والتعليقات التوضيحية، من دون معرفة هذه العناصر وقت الترجمة.
الحصول على كائن Class
احصل على كائن Class<?> باستخدام الصيغة الحرفية أو getClass() أو Class.forName().
Class<String> c1 = String.class; // literal
Class<?> c2 = "hello".getClass(); // from instance
Class<?> c3 = Class.forName("java.util.ArrayList"); // by nameفحص البيانات الوصفية للصنف
استرجع اسم الصنف وحزمته وصنفه الأب والواجهات التي يطبّقها من كائن Class.
Class<?> c = ArrayList.class;
System.out.println(c.getName()); // java.util.ArrayList
System.out.println(c.getSimpleName()); // ArrayList
System.out.println(c.getSuperclass()); // class java.util.AbstractList
for (Class<?> iface : c.getInterfaces()) System.out.println(iface.getName());سرد الحقول المعلنة
يعيد getDeclaredFields() جميع الحقول المعلنة في الصنف، بما فيها الخاصة. أما getFields() فلا يعيد سوى الحقول العامة، بما فيها الموروثة.
for (Field f : User.class.getDeclaredFields()) {
System.out.printf("%-10s %s%n", f.getType().getSimpleName(), f.getName());
}سرد الأساليب
يسرد getDeclaredMethods() جميع الأساليب، بغضّ النظر عن مستوى الوصول. استخدم getMethods() للأساليب العامة، بما فيها الموروثة.
for (Method m : String.class.getDeclaredMethods()) {
System.out.println(m.getName() + " -> " + m.getReturnType().getSimpleName());
}فحص معاملات الأساليب
استرجع أنواع المعاملات وأسماءها، التي تتطلب خيار المترجم -parameters، والتعليقات التوضيحية.
Method m = UserService.class.getDeclaredMethod("findById", Long.class);
for (Parameter p : m.getParameters()) {
System.out.println(p.getType().getSimpleName() + " " + p.getName());
}سرد المنشئات
افحص المنشئات بالطريقة نفسها التي تفحص بها الأساليب. يتضمن getDeclaredConstructors() المنشئات الخاصة المستخدمة في الأنماط الأحادية أو البُنّاة.
for (Constructor<?> c : User.class.getDeclaredConstructors()) {
System.out.println(Arrays.toString(c.getParameterTypes()));
}قراءة التعليقات التوضيحية
استرجع التعليقات التوضيحية الموجودة على الصنف أو الأسلوب أو الحقل. تحقّق من وجودها باستخدام isAnnotationPresent، واسترجع قيمتها باستخدام getAnnotation.
@RestController
@RequestMapping("/users")
public class UserController {}
// Inspection:
RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println("Path: " + Arrays.toString(rm.value()));التحقق من المعدّلات
استخدم Modifier.isPublic() وisStatic() وisFinal() وغيرها على معدّلات الحقول أو الأساليب أو الأصناف لتصفيتها حسب مستوى الوصول.
for (Field f : User.class.getDeclaredFields()) {
int mod = f.getModifiers();
if (Modifier.isPrivate(mod)) System.out.println("private: " + f.getName());
}التحقق باستخدام isAssignableFrom وinstanceof
استخدم Class.isAssignableFrom() للتحقق برمجيًا من توافق الأنواع — فهو مكافئ لـ instanceof، لكن مع كائنات Class لا تُعرف إلا أثناء التشغيل.
Class<?> parent = Collection.class;
Class<?> child = ArrayList.class;
System.out.println(parent.isAssignableFrom(child)); // true
System.out.println(child.isAssignableFrom(parent)); // falseملاحظة حول الأداء
الانعكاس أبطأ من الوصول المباشر إلى الحقول أو الأساليب بمقدار يتراوح بين 10 و50 مرة. خزّن كائنات Field وMethod مؤقتًا؛ واستدعِ setAccessible(true) مرة واحدة ثم أعد استخدامها.
private static final Field NAME_FIELD;
static {
try { NAME_FIELD = User.class.getDeclaredField("name"); NAME_FIELD.setAccessible(true); }
catch (NoSuchFieldException e) { throw new RuntimeException(e); }
}تحقق سريع
ما الأسلوب الذي يعيد الحقول الخاصة للصنف، من دون الحقول الموروثة؟
مراجعة
احصل على Class باستخدام الصيغ الحرفية أو forName(). استخدم getDeclaredFields/Methods/Constructors لفحص جميع مستويات الوصول. اقرأ التعليقات التوضيحية باستخدام getAnnotation. خزّن الكائنات الانعكاسية مؤقتًا لتحسين الأداء.
الأسئلة الشائعة
هل درس «فحص الفئات باستخدام Reflection» مجاني؟
نعم — نص درس «فحص الفئات باستخدام Reflection» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «فحص الفئات باستخدام Reflection»؟
استرجع كائنات Class وافحص الحقول والأساليب والمنشئات والتعليقات التوضيحية أثناء التشغيل تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «فحص الفئات باستخدام Reflection»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فحص الفئات باستخدام Reflection
- استدعاء الأساليب والوصول إلى الحقول
- الوكلاء الديناميكيون باستخدام InvocationHandler
- أداء Reflection والبدائل