הרהור עם קוטלין

1. הקדמה

השתקפות היא השם ליכולת לבדוק, לטעון ולנהל אינטראקציה עם מחלקות, שדות ושיטות בזמן הריצה. אנו יכולים לעשות זאת גם כאשר איננו יודעים מה הם בזמן הקומפילציה.

יש לכך מספר רב של שימושים, תלוי במה שאנחנו מפתחים. לדוגמא, מסגרות כמו אביב עושות בה שימוש רב.

תמיכה לכך מובנית ב- JVM וכך היא זמינה באופן מרומז לכל השפות מבוססות ה- JVM. עם זאת, בחלק משפות ה- JVM יש תמיכה נוספת בנוסף למה שכבר קיים.

2. השתקפות ג'אווה

כל מבני ההשתקפות הסטנדרטיים של Java זמינים ועובדים בצורה מושלמת עם קוד Kotlin שלנו. זה כולל את java.lang.Class כיתה, כמו גם כל מה שיש ב java.lang.reflect חֲבִילָה.

אם אנו רוצים להשתמש בממשקי ה- API של השתקפות Java סטנדרטיים מכל סיבה שהיא, אנו יכולים לעשות זאת בדיוק באותו אופן שהיינו עושים ב- Java. לדוגמה, כדי לקבל רשימה של כל השיטות הציבוריות בשיעור קוטלין היינו עושים:

MyClass :: class.java.methods

זה מתפרק למבנים הבאים:

  • MyClass :: מחלקה נותן לנו את ייצוג מחלקת Kotlin עבור הכיתה שלי מעמד
  • .java נותן לנו את java.lang.Class שווה ערך
  • .שיטות היא קריאה ל java.lang.Class.getMethods () שיטת אביזר

זה יעבוד בדיוק זהה אם נקרא מג'אווה או מקוטלין, ובין אם נקרא בשיעור ג'אווה או קוטלין. זה כולל מבנים ספציפיים של קוטלין, כגון מחלקות נתונים.

מחלקת נתונים ExampleDataClass (שם val: String, var enabled: Boolean) ExampleDataClass :: class.java.methods.forEach (:: println)

קוטלין ממיר את הסוגים המוחזרים גם לייצוגי קוטלין.

באמור לעיל, אנו מקבלים א קוטלין. מערך שעליו נוכל להתקשר לכל אחד().

3. שיפורי השתקפות קוטלין

אמנם אנו יכולים להשתמש בממשקי ה- API של Reflection Java רגילים, אך הם אינם מודעים לכל התוספים שקוטלין מביא לפלטפורמה..

בנוסף, לפעמים זה יכול להיות מעט מביך לשימוש במצבים מסוימים. Kotlin מביא API משיקוף משלו שנוכל להשתמש בו כדי לפתור את הבעיות הללו.

כל נקודות הכניסה ל- Kotlin Reflection API משתמשות בהפניות. מוקדם יותר ראינו את השימוש ב- ::מעמד לתת התייחסות להגדרת תשחץ. נוכל להשתמש בזה גם כדי לקבל הפניות לשיטות ומאפיינים.

3.1. הפניות לכיתת קוטלין

ממשק ה- API של השתקפות Kotlin מאפשר גישה להפניה למחלקה. לאחר מכן ניתן להשתמש בזה בכדי לבחון את הפרטים המלאים של כיתת קוטלין. זה נותן גישה להתייחסות Java Class - java.lang.Class אובייקט - אך גם לכל הפרטים הספציפיים של קוטלין.

ממשק ה- API של Kotlin לפרטי כיתות מתמקד ברחבי kotlin.reflect.KClass מעמד. ניתן לגשת אליו באמצעות :: מפעיל מכל שם מחלקה או מופע - למשל מחרוזת :: מחלקה.

לחלופין, ניתן לגשת אליו באמצעות שיטת ההרחבה java.lang.Class.kotlin אם ג'אווה מעמד מופע זמין לנו:

val listClass: KClass = List :: class val name = "Baeldung" val stringClass: KClass = name :: class val someClass: Class val kotlinClass: KClass = someClass.kotlin

לאחר שהשגנו א KClass יש כמה דברים פשוטים שהוא יכול לספר לנו על הכיתה המדוברת. חלקם הם מושגי Java סטנדרטיים, ואחרים הם מושגים ספציפיים לקוטלין.

לדוגמה, אנו יכולים לגלות בקלות אם מחלקה היא מופשטת או סופית, אך אנו יכולים גם לגלות אם המחלקה היא מחלקת נתונים או מחלקה נלווית:

val stringClass = String :: class assertEquals ("kotlin.String", stringClass.qualifiedName) assertFalse (stringClass.isData) assertFalse (stringClass.isCompanion) assertFalse (stringClass.isAbstract) assertTrue (stringClass.isFinal) assertFalse (stringClass.is)

יש לנו גם דרכים להסתובב בהיררכיית הכיתות. בג'אווה, אנחנו כבר יכולים לעבור ממעמד למחלקה העל שלו, לממשקים ולמחלקה החיצונית שהיא סגורה בו - אם מתאים.

קוטלין מוסיף לכך את היכולת להשיג את אובייקט המלווה עבור מעמד שרירותי לְהִתְנַגֵד למשל עבור מחלקת אובייקטים:

println (TestWithCompanion :: class.companionObject) println (TestWithCompanion :: class.companionObjectInstance) println (TestObject :: class.objectInstance)

אנו יכולים ליצור מופעים חדשים של מחלקה גם מתוך הפניה לכיתה, באותה צורה כמו ב- Java:

val listClass = ArrayList :: class val list = listClass.createInstance () assertTrue (הרשימה היא ArrayList)

לחלופין, אנו יכולים לגשת לבנאים ולהשתמש במפורש אם אנו צריכים. כל אלה הם הפניות לשיטה כפי שנדון בסעיף הבא.

באופן דומה מאוד, אנו יכולים לקבל גישה לכל השיטות, המאפיינים, הרחבות וחברים אחרים בכיתה:

val bigDecimalClass = BigDecimal :: println class (bigDecimalClass.constructors) println (bigDecimalClass.functions) println (bigDecimalClass.memberProperties) println (bigDecimalClass.memberExtensionFunctions)

3.2. הפניות לשיטת קוטלין

בנוסף ליכולת לתקשר עם שיעורים, אנחנו יכולים גם לקיים אינטראקציה עם שיטות ומאפיינים.

זה כולל מאפייני מחלקה - מוגדרים עם val אוֹ var, שיטות כיתה סטנדרטיות ופונקציות ברמה העליונה. כמו בעבר, זה עובד באותה מידה על קוד שנכתב בג'אווה רגילה כמו על קוד שנכתב בקוטלין.

בדיוק באותו אופן כמו בשיעורים, נוכל להשיג הפניה לשיטה או לנכס באמצעות ה-:: מַפעִיל.

זה נראה בדיוק כמו ב- Java 8 כדי לקבל התייחסות לשיטה, ואנחנו יכולים להשתמש בו בדיוק באותו אופן. עם זאת, בקוטלין ניתן להשתמש בהתייחסות לשיטה זו גם לקבלת מידע השתקפות אודות המטרה.

לאחר שקיבלנו הפניה לשיטה, אנו יכולים לקרוא לה כאילו הייתה באמת השיטה המדוברת. זה ידוע בתור הפניה להתקשרות:

val str = "שלום" val lengthMethod = str :: length assertEquals (5, lengthMethod ())

אנו יכולים גם לקבל פרטים נוספים על השיטה עצמה, באותו אופן, שנוכל לקבל שיעורים. זה כולל גם פרטי Java סטנדרטיים, כמו גם פרטים ספציפיים של Kotlin, למשל אם השיטה היא מַפעִיל או אם זה בשורה:

val byteInputStream = מחרוזת :: byteInputStream assertEquals ("byteInputStream", byteInputStream.name) assertFalse (byteInputStream.isSuspend) assertFalse (byteInputStream.isExternal) assertTrue (byteInputStream.isInline) assertFalse (byteInputStream.is)

בנוסף לכך, אנו יכולים לקבל מידע נוסף על תשומות ותפוקות השיטה באמצעות הפניה זו.

זה כולל פרטים על סוג ההחזרה והפרמטרים, כולל פרטים ספציפיים של קוטלין - כמו בטלות ואופציות.

val str = "שלום" val method = str :: byteInputStream assertEquals (ByteArrayInputStream :: class.starProjectedType, method.returnType) assertFalse (method.returnType.isMarkedNullable) assertEquals (1, method.parameters.size) assertTrue [method.parameters 0] .isOptional) assertFalse (method.parameters [0] .isVararg) assertEquals (Charset :: class.starProjectedType, method.parameters [0] .type)

3.3. הפניות לרכוש קוטלין

זה עובד בדיוק אותו דבר גם עבור נכסיםאם כי ברור, הפרטים שניתן להשיג שונים. נכסים במקום יכולים ליידע אותנו אם הם קבועים, מאותחלים מאוחרים או ניתנים לשינוי:

lateinit var mutableProperty: String val mProperty = this :: mutableProperty assertEquals ("mutableProperty", mProperty.name) assertTrue (mProperty.isLateinit) assertFalse (mProperty.isConst) assertTrue (mProperty is KMut)

שים לב שמושג המאפיינים עובד גם בכל קוד שאינו קוטלין. אלה מזוהים על ידי שדות העוקבים אחר מוסכמות JavaBeans בנוגע לשיטות גטר וסתר.

זה כולל שיעורים בספרייה הסטנדרטית של Java. לדוגמא, ה זורק בכיתה יש נכס ניתן לזרוק. הודעה מתוקף העובדה שיש שיטה getMessage () מוגדר בו.

אנו יכולים לגשת לנכס בפועל באמצעות הפניות לשיטות שנחשפות - ה גטר ו מגדיר שיטות. ה מגדיר זמין רק אם אנו עובדים עם KMutableProperty - כלומר הנכס הוכרז כ- varואילו ה גטר תמיד זמין.

אלה נחשפים בצורה קלה יותר לשימוש דרך לקבל() ו מַעֲרֶכֶת() שיטות. ה גטר ו מגדיר ערכים הם הפניות לשיטה בפועל, ומאפשרים לנו לעבוד איתם בדיוק כמו כל הפניה לשיטה אחרת:

val prop = this :: mutableProperty assertEquals (String :: class.starProjectedType, prop.getter.returnType) prop.set ("Hello") assertEquals ("Hello", prop.get ()) prop.setter ("World") assertEquals ("עולם", prop.getter ())

4. סיכום

מאמר זה נותן סקירה של כמה מהדברים שניתן להשיג באמצעות השתקפות בקוטלין, כולל האופן שבו הוא מתקשר עם ויכולתו של השתקפות המובנית בשפת Java הרגילה.

כל הדוגמאות זמינות ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found