Reflection عملي
اقرؤوا Annotations ديناميكيًا
Reflection عملي درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
التعليقات التوضيحية تلتقي بالانعكاس
يمكن اكتشاف التعليمة التوضيحية ذات الاحتفاظ من النوع RUNTIME في وقت التشغيل عبر الانعكاس. ويمكّن هذا الجمع بينهما أدوات التسلسل وأدوات التحقق وحقن الاعتماديات.
سنقرأ في هذا الدرس تعليقاتنا التوضيحية الخاصة ديناميكيًا.
قراءة تعليمة توضيحية لفئة
يعرّض كل KClass قائمة annotations. ويمكننا فحصها للعثور على تعليمة توضيحية محددة حسب النوع.
@Retention(AnnotationRetention.RUNTIME)
annotation class Entity(val table: String)
@Entity("users")
class User
fun main() {
val ann = User::class.annotations
.filterIsInstance<Entity>()
.first()
println(ann.table)
}المساعد findAnnotation
يُعد الامتداد findAnnotation أوضح من إجراء التصفية يدويًا. ويعيد التعليمة التوضيحية أو null.
import kotlin.reflect.full.findAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class Entity(val table: String)
@Entity("orders")
class Order
fun main() {
val ann = Order::class.findAnnotation<Entity>()
println(ann?.table)
}التعليقات التوضيحية على الخصائص
تحمل الخصائص تعليقاتها التوضيحية الخاصة. كرر على memberProperties وافحص annotations الخاصة بكل خاصية.
import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.findAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class Column(val name: String)
class Product(@Column("product_id") val id: Int, val title: String)
fun main() {
Product::class.memberProperties.forEach { prop ->
val col = prop.findAnnotation<Column>()
if (col != null) println(prop.name + " -> " + col.name)
}
}إنشاء أداة تسلسل مصغرة
اجمع بين قراءة الخصائص والتعليقات التوضيحية لإنشاء المخرجات. نربط هنا كل خاصية بسلسلة من الشكل key=value، مستخدمين اسم العمود عند توفره.
import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.findAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class Column(val name: String)
class Item(@Column("item_id") val id: Int, val name: String)
fun main() {
val item = Item(7, "Book")
val parts = Item::class.memberProperties.map { p ->
val key = p.findAnnotation<Column>()?.name ?: p.name
key + "=" + p.getter.call(item)
}
println(parts.joinToString(", "))
}التخطي باستخدام علامة
يمكن لتعليمة توضيحية تعمل كعلامة أن تحدد الخصائص التي ينبغي تجاهلها. نتحقق من وجودها باستخدام hasAnnotation.
import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.hasAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class Transient2
class Account(val id: Int, @Transient2 val secret: String)
fun main() {
Account::class.memberProperties
.filterNot { it.hasAnnotation<Transient2>() }
.forEach { println(it.name) }
}قراءة معاملات التعليقات التوضيحية
بعد حصولك على مثيل التعليمة التوضيحية، تصبح معاملاتها خصائص عادية. اقرأها كما تقرأ أي حقل.
import kotlin.reflect.full.findAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class Validated(val min: Int, val max: Int)
@Validated(min = 1, max = 100)
class Quantity
fun main() {
val v = Quantity::class.findAnnotation<Validated>()!!
println("range " + v.min + ".." + v.max)
}التعليقات التوضيحية على الدوال
يمكن أيضًا وضع التعليقات التوضيحية على الدوال وفحصها. تستخدم الأطر هذه الإمكانية للعثور على معالجات، مثلما تحدد مشغلات الاختبار دوال الاختبار.
import kotlin.reflect.full.memberFunctions
import kotlin.reflect.full.findAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class Route(val path: String)
class Api {
@Route("/home")
fun home() = "home page"
}
fun main() {
Api::class.memberFunctions.forEach { f ->
f.findAnnotation<Route>()?.let { println(f.name + " @ " + it.path) }
}
}تفعيل السلوك
اقرأ تعليمة المسار التوضيحية ونفّذ استدعاءً فعليًا. هذا هو جوهر طريقة عمل أطر التوجيه.
import kotlin.reflect.full.memberFunctions
import kotlin.reflect.full.findAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class Route(val path: String)
class Api {
@Route("/ping")
fun ping() = "pong"
}
fun main() {
val api = Api()
val target = "/ping"
Api::class.memberFunctions.forEach { f ->
if (f.findAnnotation<Route>()?.path == target) {
println(f.call(api))
}
}
}الاستخدامات الواقعية
يقف الانعكاس المعتمد على التعليقات التوضيحية وراء العديد من المكتبات:
- تسلسل JSON لربط الحقول بالمفاتيح
- التحقق لفرض القيود
- التوجيه لمطابقة المسارات بالمعالجات
- حقن الاعتماديات لتوصيل المكونات
حافظ على نطاق محدد
من الأفضل حصر الانعكاس في شيفرة الإعداد والأطر التي تعمل مرة واحدة أو نادرًا. خزّن النتائج مؤقتًا متى أمكنك ذلك. وفي المسارات الساخنة لكل طلب، فضّل المعالجة في وقت الترجمة.
تحقق سريع
اختبر مدى فهمك للاستخدام العملي للانعكاس.
مراجعة
لقد جمعت بين التعليقات التوضيحية والانعكاس من أجل:
- العثور على التعليقات التوضيحية للفئات والخصائص والدوال
- قراءة معاملات التعليقات التوضيحية في وقت التشغيل
- إنشاء أداة تسلسل مصغرة وموزع مسارات
- تخطي الحقول التي تحمل تعليقات توضيحية تعمل كعلامات
هكذا تُبنى الأطر الحقيقية.
الأسئلة الشائعة
هل درس «Reflection عملي» مجاني؟
نعم — نص درس «Reflection عملي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «Reflection عملي»؟
اقرؤوا Annotations ديناميكيًا تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «Reflection عملي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- استخدام Annotations
- تعريف Annotations
- أساسيات Reflection
- Reflection عملي