التأمل والاستبطان في Kotlin: نظرة تحت غطاء JVM

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التأمل والاستبطان في Kotlin: كيف تنظر داخل الكود الخاص بك

\n\n

تخيل أنك مبرمج يكتب كودًا يحلل نفسه بنفسه. يبدو وكأنه خيال علمي؟ في عالم Kotlin، هذا واقع. التأمل والاستبطان هما الأدوات التي تحول الكود الخاص بك من منفذ بسيط إلى مبرمج فوقي حقيقي. إذا كنت ترغب يومًا في الحصول على معلومات عن الفئات بشكل ديناميكي، أو استدعاء دوال بأسمائها، أو العمل مع التعليقات التوضيحية في وقت التشغيل، فهذه المقالة لك.

\n\n

سنشرح كيف يستخدم Kotlin، كونه لغة تعمل فوق JVM، التأمل، وكيف يمكنك من خلال أمثلة بسيطة إضافة السحر إلى مشاريعك. هيا بنا!

\n\n

ما هو التأمل والاستبطان؟ الفرق الذي يجب معرفته

\n\n

قبل الغوص في الكود، دعنا نوضح المصطلحات. غالبًا ما يتم الخلط بين هذه المفاهيم، لكن هناك خط رفيع بينها.

\n\n
    \n
  • الاستبطان — هو قدرة البرنامج على "النظر إلى نفسه". يمكنك الحصول على معلومات حول بنية الفئات: خصائصها، دوالها، منشئاتها. الأمر أشبه بفتح غطاء محرك السيارة والنظر إلى ما بداخله.
  • \n
  • التأمل — هو شيء أكثر قوة. لا تنظر فقط، بل تغير سلوك البرنامج أثناء التنفيذ. يمكنك استدعاء دوال لم تكن تعرفها في مرحلة التجميع، وإنشاء كائنات بناءً على اسم الفئة كنص.
  • \n
\n\n

في Kotlin، يرتبط التأمل ارتباطًا وثيقًا بتأمل JVM، لكن له واجهات برمجة تطبيقات خاصة بـ Kotlin (مثل KClass، KFunction). ونعم، للعمل مع التأمل ستحتاج إلى إضافة تبعية في ملف build.gradle.kts:

\n\n
dependencies {\n    implementation("org.jetbrains.kotlin:kotlin-reflect:1.9.22")\n}\n
\n\n

بدونها، ستتمكن فقط من استخدام الإمكانيات الأساسية، مثل javaClass. لكن لتجربة Kotlin كاملة، قم بتثبيت المكتبة.

\n\n

KClass: أداتك الرئيسية للاستبطان

\n\n

في Java، اعتدنا على Class<?>. في Kotlin، نظيره هو KClass. إنها نقطة الدخول إلى عالم التأمل. يمكن الحصول على KClass بطريقتين:

\n\n
// الطريقة 1: عبر كائن الفئة\nval myClass: KClass<String> = String::class\n\n// الطريقة 2: عبر مثيل\nval str = "مرحبًا، أيها العالم!"\nval classFromInstance: KClass<out String> = str::class\n
\n\n

الآن لديك access إلى الكثير من المعلومات: اسم الفئة، الحزمة، المنشئات، الخصائص، الدوال. لنلق نظرة على مثال:

\n\n
data class User(val name: String, val age: Int)\n\nfun main() {\n    val kClass = User::class\n    println("اسم الفئة: ${kClass.simpleName}") // User\n    println("الحزمة: ${kClass.qualifiedName}") // com.example.User\n    println("عدد الخصائص: ${kClass.memberProperties.size}") // 2 (name, age)\n    \n    kClass.memberProperties.forEach { prop ->\n        println("خاصية: ${prop.name}, النوع: ${prop.returnType}")\n    }\n}\n
\n\n

هذا هو الاستبطان الخالص في Kotlin — نحن فقط ننظر إلى البنية. لا تغيير في السلوك.

\n\n

الحصول على معلومات حول الدوال والمنشئات

\n\n

أحيانًا تحتاج إلى معرفة الدوال الموجودة في الفئة، أو حتى استدعائها. لهذا نستخدم KFunction.

\n\n
class Calculator {\n    fun add(a: Int, b: Int): Int = a + b\n    fun multiply(a: Int, b: Int): Int = a * b\n}\n\nfun main() {\n    val calcClass = Calculator::class\n    println("دوال الفئة Calculator:")\n    calcClass.memberFunctions.forEach { func ->\n        println(" - ${func.name} (المعلمات: ${func.parameters})")\n    }\n}\n
\n\n

سيكون الناتج تقريبًا كالتالي:

\n
دوال الفئة Calculator:\n - add (المعلمات: [a, b])\n - multiply (المعلمات: [a, b])\n
\n\n

التأمل في العمل: استدعاء الدوال وإنشاء الكائنات

\n\n

والآن الجزء الممتع — التأمل. لنفترض أن لديك نصًا باسم دالة،

المدونات

توصيات الكتب