0Pricing
Kotlin Academy · درس

قراءة التعليقات التوضيحية وقت التشغيل

استرجع مثيلات التعليقات التوضيحية من التصريحات باستخدام انعكاس Kotlin.

قراءة التعليقات التوضيحية وقت التشغيل درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

المتطلبات الأساسية

لقراءة التعليقات التوضيحية في وقت التشغيل، تحتاج إلى: (1) تعريف التعليق التوضيحي باستخدام @Retention(RUNTIME)، (2) وجود التبعية kotlin-reflect في مسار الأصناف، و(3) مرجع KClass أو KFunction أو KProperty إلى العنصر ذي التعليق التوضيحي.

قراءة التعليقات التوضيحية من KClass

استدعِ annotations على KClass للحصول على جميع التعليقات التوضيحية على ذلك الصنف، أو استخدم findAnnotation<T>() لنوع محدد:

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS)
annotation class Table(val name: String)

@Table(name = "users")
class UserEntity

val ann = UserEntity::class.findAnnotation<Table>()
println(ann?.name)  // "users"

قراءة التعليقات التوضيحية من الخصائص

يمكنك الوصول إلى التعليقات التوضيحية على الخصائص عبر KProperty.annotations أو findAnnotation<T>():

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Column(val name: String)

data class User(@Column("user_name") val name: String)

val prop = User::name
val col = prop.findAnnotation<Column>()
println(col?.name)  // "user_name"

قراءة التعليقات التوضيحية من الدوال

استخدم KFunction.findAnnotation<T>() لقراءة التعليقات التوضيحية على الدوال:

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
annotation class Transactional

class UserService {
    @Transactional
    fun save(user: User) { /*...*/ }
}

val fn = UserService::save
val isTx = fn.hasAnnotation<Transactional>()
println(isTx)  // true

التكرار على جميع الخصائص بحثًا عن التعليقات التوضيحية

من الأنماط الشائعة فحص جميع الخصائص المعلنة في صنف وتجميع الخصائص التي تحمل تعليقًا توضيحيًا محددًا:

fun <A : Annotation> KClass<*>.annotatedProperties(
    annotationClass: KClass<A>
): List<Pair<KProperty1<*, *>, A>> =
    declaredMemberProperties
        .mapNotNull { prop ->
            prop.findAnnotation(annotationClass)?.let { ann -> prop to ann }
        }

قراءة التعليقات التوضيحية على المعلمات

يمكنك الوصول إلى التعليقات التوضيحية لمعلمات المنشئ عبر KFunction.parameters:

class Repo(
    @param:Validate(minLength = 3) val name: String
)

val ctor = Repo::class.primaryConstructor!!
val param = ctor.parameters.first()
val ann = param.findAnnotation<Validate>()
println(ann?.minLength)  // 3

hasAnnotation في مقابل findAnnotation

استخدم hasAnnotation<T>() للتحقق المنطقي، واستخدم findAnnotation<T>() عندما تحتاج إلى قيم خصائص التعليق التوضيحي. كلتاهما دالتا توسعة من kotlin.reflect.full.

التنقل في تدرج الأصناف

لا تُورث التعليقات التوضيحية على الأصناف الفائقة أو الواجهات تلقائيًا في انعكاس Kotlin. يجب أن تتنقل عبر KClass.superclasses أو تستخدم KClass.allSuperclasses إذا كنت تحتاج إلى التعليقات التوضيحية الموروثة.

fun KClass<*>.findAnnotationRecursive(ann: KClass<out Annotation>) =
    generateSequence(this) { null } // simplified — real impl walks supers
        .flatMap { it.annotations }
        .firstOrNull { it.annotationClass == ann }

الأداء

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

أهداف موضع الاستخدام وحقول JVM

بالنسبة إلى التعليقات التوضيحية على الخصائص التي تستخدم الهدف @field:، يوجد التعليق التوضيحي في الحقل الداعم لـ JVM. ويمكنك الوصول إليه عبر انعكاس Java باستخدام KProperty.javaField?.annotations بدلًا من قائمة annotations في Kotlin، التي تغطي موضع الإعلان في Kotlin فقط.

مثال عملي: مُحوِّل ORM بسيط

يقرأ مُحوِّل ORM صغير التعليقات التوضيحية @Column لإنشاء قائمة أعمدة SQL:

fun columns(klass: KClass<*>): String =
    klass.declaredMemberProperties
        .mapNotNull { it.findAnnotation<Column>()?.name }
        .joinToString(", ")

println(columns(User::class))  // "user_name, email"

تحقق سريع

كيف تقرأ تعليقًا توضيحيًا محددًا من النوع MyAnn من KClass؟

مراجعة: قراءة التعليقات التوضيحية في وقت التشغيل

أهم النقاط:

  • يجب أن يتضمن التعليق التوضيحي @Retention(RUNTIME)
  • استخدم findAnnotation<T>() للحصول على قيمة التعليق التوضيحي، وhasAnnotation<T>() للتحقق المنطقي
  • يعمل ذلك مع KClass وKFunction وKProperty وKParameter
  • خزّن نتائج الفحص مؤقتًا عند بدء التشغيل لتجنب التكلفة الإضافية لكل طلب
  • بالنسبة إلى التعليقات التوضيحية @field:، استخدم KProperty.javaField

الأسئلة الشائعة

هل درس «قراءة التعليقات التوضيحية وقت التشغيل» مجاني؟

نعم — نص درس «قراءة التعليقات التوضيحية وقت التشغيل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «قراءة التعليقات التوضيحية وقت التشغيل»؟

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

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «قراءة التعليقات التوضيحية وقت التشغيل»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

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

جميع الدروس في هذه الدورة

  1. انعكاس Kotlin: ‏KClass وKFunction وKProperty
  2. إنشاء التعليقات التوضيحية المخصصة وتحديد أهدافها
  3. قراءة التعليقات التوضيحية وقت التشغيل
  4. التحقق والتعيين المعتمدان على الانعكاس
← العودة إلى Kotlin Academy