Kotlin Academy · पाठ

Reflection-आधारित Validation और Mapping

Annotation-driven reflection का उपयोग करके सरल validator या object mapper बनाएँ।

पाठ 4, कुल 4 में से13 चरण

Reflection-आधारित Validation और Mapping, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

यह पैटर्न किस समस्या का समाधान करता है

रिफ्लेक्शन-आधारित सत्यापन रनटाइम पर किसी वर्ग के गुणधर्मों से एनोटेशन पढ़ता है और सत्यापन नियम अपने-आप लागू करता है—हर फ़ील्ड के लिए मैन्युअल जाँच की आवश्यकता नहीं होती। यही तकनीक वस्तुओं और डेटाबेस पंक्तियों के बीच रूपांतरण करने वाले ओआरएम मैपर को भी सक्षम बनाती है।

Validate एनोटेशन

प्रॉपर्टीज़ को लक्ष्य बनाने वाला, रनटाइम में संरक्षित रहने वाला एनोटेशन परिभाषित कीजिए:

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Validate(
    val minLength: Int = 0,
    val maxLength: Int = Int.MAX_VALUE,
    val pattern: String = ""
)

डेटा क्लास पर एनोटेशन लगाना

डेटा क्लास की प्रॉपर्टीज़ पर @Validate लगाइए। वैलिडेटर इन्हें रनटाइम पर स्कैन करेगा:

data class UserForm(
    @Validate(minLength = 2, maxLength = 50) val name: String,
    @Validate(pattern = "^[\\w.]+@[\\w]+\\.[a-z]{2,}$") val email: String,
    @Validate(minLength = 8) val password: String
)

वैलिडेटर फ़ंक्शन

प्रॉपर्टीज़ पर क्रम से जाने, एनोटेशन खोजने और त्रुटियां एकत्र करने के लिए KClass.declaredMemberProperties का उपयोग कीजिए:

fun validate(obj: Any): List<String> {
    val errors = mutableListOf<String>()
    for (prop in obj::class.declaredMemberProperties) {
        val ann = prop.findAnnotation<Validate>() ?: continue
        val value = (prop as KProperty1<Any, *>).get(obj)?.toString() ?: ""
        if (value.length < ann.minLength) errors += "${prop.name}: too short"
        if (value.length > ann.maxLength) errors += "${prop.name}: too long"
        if (ann.pattern.isNotEmpty() && !value.matches(Regex(ann.pattern)))
            errors += "${prop.name}: invalid format"
    }
    return errors
}

वैलिडेटर चलाना

किसी भी एनोटेशन लगे ऑब्जेक्ट के साथ validate() कॉल कीजिए। फ़ंक्शन त्रुटि संदेशों की एक सूची लौटाता है; खाली सूची का अर्थ है कि ऑब्जेक्ट वैध है:

val form = UserForm("A", "not-an-email", "short")
val errors = validate(form)
errors.forEach(::println)
// name: too short
// email: invalid format
// password: too short

@Column के साथ ऑब्जेक्ट से मैप में रूपांतरण

एक अन्य रिफ्लेक्शन पैटर्न, कॉलम नाम प्रदान करने वाले @Column एनोटेशन का उपयोग करके किसी ऑब्जेक्ट को Map में मैप करता है:

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

fun toMap(obj: Any): Map<String, Any?> =
    obj::class.declaredMemberProperties
        .mapNotNull { prop ->
            val col = prop.findAnnotation<Column>() ?: return@mapNotNull null
            col.name to (prop as KProperty1<Any, *>).get(obj)
        }.toMap()

मैपर का उपयोग करना

डेटा क्लास पर एनोटेशन लगाइए और कॉलम-कुंजी वाला मैप प्राप्त करने के लिए toMap() कॉल कीजिए, जो INSERT स्टेटमेंट के लिए तैयार हो:

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

val user = User("Alice", "alice@example.com")
println(toMap(user))
// {user_name=Alice, user_email=alice@example.com}

रिफ्लेक्शन परिणामों को कैश करना

रिफ्लेक्शन स्कैन महंगे होते हैं। ConcurrentHashMap का उपयोग करके स्टार्टअप पर प्रॉपर्टी-से-एनोटेशन मैपिंग को कैश कीजिए, जिसकी कुंजी KClass हो:

val cache = ConcurrentHashMap<KClass<*>, List<Pair<KProperty1<Any,*>, Column>>>()

fun columnsOf(klass: KClass<*>) = cache.getOrPut(klass) {
    klass.declaredMemberProperties
        .mapNotNull { p ->
            p.findAnnotation<Column>()?.let { (p as KProperty1<Any,*>) to it }
        }
}

वैलिडेशन और मैपिंग को संयोजित करना

आप एक ही प्रॉपर्टी पर कई एनोटेशन लगा सकते हैं और प्रत्येक को स्वतंत्र रूप से प्रोसेस कर सकते हैं। पहले वैलिडेट कीजिए, फिर मैप कीजिए — या प्रत्येक एनोटेशन प्रकार को एकत्र करके एक ही पास में दोनों कार्य कीजिए:

data class Product(
    @Validate(minLength = 1) @Column("product_name") val name: String,
    @Column("price") val price: Double
)

सीमाएं

रिफ्लेक्शन-आधारित वैलिडेशन शक्तिशाली है, लेकिन इसके कुछ समझौते हैं: इससे रनटाइम ओवरहेड बढ़ता है, यह एनोटेशन रिटेंशन पर निर्भर करता है और यह कंपाइल-टाइम पर त्रुटियां नहीं पकड़ सकता। प्रदर्शन-संवेदनशील या कंपाइल-टाइम पर सुरक्षित वैलिडेशन के लिए इसके बजाय KSP-जनरेटेड कोड पर विचार कीजिए।

इस पैटर्न का उपयोग कब करें

रिफ्लेक्शन-आधारित वैलिडेशन ऐसे फ़्रेमवर्क कोड में बहुत उपयोगी है, जिसे उपयोगकर्ता द्वारा परिभाषित किसी भी क्लास को संभालना हो: ORM, सीरियलाइज़र, फ़ॉर्म वैलिडेटर और कॉन्फ़िगरेशन बाइंडर। अपने प्रकारों पर नियंत्रण रखने वाले एप्लिकेशन कोड में गति और स्पष्टता के लिए स्पष्ट वैलिडेशन को प्राथमिकता दीजिए।

त्वरित जांच

किस रिटेंशन नीति की आवश्यकता होती है, ताकि वैलिडेशन एनोटेशन को रनटाइम पर पढ़ा जा सके?

पुनरावलोकन: रिफ्लेक्शन-आधारित वैलिडेशन और मैपिंग

मुख्य बातें:

  • प्रॉपर्टीज़ को लक्ष्य बनाने वाले और रनटाइम में संरक्षित रहने वाले एनोटेशन घोषित कीजिए
  • वैलिडेशन या मैपिंग को संचालित करने के लिए declaredMemberProperties + findAnnotation का उपयोग कीजिए
  • बार-बार होने वाले रिफ्लेक्शन ओवरहेड से बचने के लिए परिणामों को प्रति KClass कैश कीजिए
  • संयुक्त व्यवहार के लिए किसी प्रॉपर्टी पर कई एनोटेशन लगाइए
  • प्रदर्शन-संवेदनशील पथों में कंपाइल-टाइम विकल्पों के लिए KSP पर विचार कीजिए
शुरुआत निःशुल्क

एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “Reflection-आधारित Validation और Mapping” पाठ निःशुल्क है?

हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Reflection-आधारित Validation और Mapping” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Reflection-आधारित Validation और Mapping” में मैं क्या सीखूँगा?

Annotation-driven reflection का उपयोग करके सरल validator या object mapper बनाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“Reflection-आधारित Validation और Mapping” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Kotlin Reflection: KClass, KFunction, KProperty
  2. कस्टम Annotations बनाना और Target करना
  3. Runtime पर Annotations पढ़ना
  4. Reflection-आधारित Validation और Mapping
← Kotlin Academy पर वापस जाएँ