אחזור שם כיתה בג'אווה

1. סקירה כללית

במדריך זה נלמד על ארבע דרכים לאחזר את שם הכיתה משיטות ב- מעמד ממשק API: getSimpleName (), getName (), getTypeName () ו getCanonicalName ().

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

2. אחזור שם פשוט

נתחיל עם getSimpleName () שיטה.

ב- Java ישנם שני סוגים של שמות: פָּשׁוּט ו מוסמך. שם פשוט מורכב ממזהה ייחודי ואילו שם מוסמך הוא רצף של שמות פשוטים המופרדים באמצעות נקודות.

כשמו כן הוא, getSimpleName () מחזיר את השם הפשוט של המחלקה הבסיסית, כלומר את השם שהוא קיבל בקוד המקור.

בואו נדמיין את השיעור הבא:

חבילה com.baeldung.className; מחלקה ציבורית RetrieveClassName {}

שמו הפשוט יהיה RetrieveClassName:

assertEquals ("RetrieveClassName", RetrieveClassName.class.getSimpleName ());

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

ובשביל מערכים השיטה תחזור השם הפשוט של סוג המערך ואחריו סוגרי פתיחה וסגירה של זוג לכל מימד של המערך ([]):

RetrieveClassName [] names = new RetrieveClassName []; assertEquals ("RetrieveClassName []", names.getClass (). getSimpleName ());

כתוצאה מכך, עבור דו ממדי חוּט מערך, קורא getSimpleName () על הכיתה שלה יחזור חוּט[][].

לבסוף, יש המקרה הספציפי של שיעורים אנונימיים. יִעוּד getSimpleName () בשיעור אנונימי יחזיר מחרוזת ריקה.

3. אחזור שמות אחרים

עכשיו הגיע הזמן לבדוק כיצד נקבל את שם הכיתה, שם הסוג או השם הקנוני. בניגוד getSimpleName ()שמות אלה נועדו לתת מידע נוסף על הכיתה.

ה getCanonicalName () השיטה מחזירה תמיד את השם הקנוני כהגדרתם במפרט שפת Java.

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

3.1. סוגים פרימיטיביים

נתחיל עם טיפוסים פרימיטיביים, מכיוון שהם פשוטים. לסוגים פרימיטיביים, כל שלוש השיטות getName (), getTypeName () ו getCanonicalName () יחזיר את אותה התוצאה כמו getSimpleName ():

assertEquals ("int", int.class.getName ()); assertEquals ("int", int.class.getTypeName ()); assertEquals ("int", int.class.getCanonicalName ());

3.2. סוגי אובייקטים

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

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

assertEquals ("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getName ()); assertEquals ("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getTypeName ()); assertEquals ("com.baeldung.className.RetrieveClassName", RetrieveClassName.class.getSimpleName ());

3.3. שיעורים פנימיים

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

שיעורים פנימיים הם אחד מהם. ה getName () ו getTypeName () שיטות מתנהגות אחרת מ- getCanonicalName () שיטה לשיעורים פנימיים.

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

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

בואו נדמיין מעמד פנימי InnerClass שלנו RetrieveClassName:

מחלקה ציבורית RetrieveClassName {מחלקה ציבורית InnerClass {}}

ואז כל שיחה מציינת את המעמד הפנימי בצורה מעט שונה:

assertEquals ("com.baeldung.RetrieveClassName.InnerClass", RetrieveClassName.InnerClass.class.getCanonicalName ()); assertEquals ("com.baeldung.RetrieveClassName $ InnerClass", RetrieveClassName.InnerClass.class.getName ()); assertEquals ("com.baeldung.RetrieveClassName $ InnerClass", RetrieveClassName.InnerClass.class.getTypeName ());

3.4. שיעורים אנונימיים

שיעורים אנונימיים הם יוצא מן הכלל נוסף.

כפי שכבר ראינו אין להם שם פשוט, אבל אין להם שם קנוני. לָכֵן, getCanonicalName () לא מחזיר כלום. באופוזיציה getSimpleName (), getCanonicalName () יחזור ריקולא מחרוזת ריקה כשקוראים למחלקה אנונימית.

בנוגע ל getName () ו getTypeName () הם יחזירו את שם קנוני של הכיתה הקוראת ואחריו דולר ומספר המייצג את מעמד הכיתה האנונימית בקרב כל המעמדות האנונימיים שנוצרו בכיתת המתקשרים.

בואו נמחיש זאת בדוגמה. ניצור כאן שני שיעורים אנונימיים ונתקשר getName () על הראשון ו getTypeName () בשני, מכריז עליהם com.baeldung. ראשי:

assertEquals ("com.baeldung.Main $ 1", RetrieveClassName חדש) {} .getClass (). getName ()); assertEquals ("com.baeldung.Main $ 2", RetrieveClassName חדש) {} .getClass (). getTypeName ());

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

3.5. מערכים

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

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

בואו נראה את הדוגמה הבאה בה אנו קוראים getTypeName () ו getCanonicalName () על דו ממדי InnerClass מַעֲרָך:

assertEquals ("com.baeldung.RetrieveClassName $ InnerClass [] []", RetrieveClassName.InnerClass [] []. class.getTypeName ()); assertEquals ("com.baeldung.RetrieveClassName.InnerClass [] []", RetrieveClassName.InnerClass [] []. class.getCanonicalName ());

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

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

assertEquals ("[[I", int [] []. class.getName ());

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

assertEquals ("[Lcom.baeldung.className.RetrieveClassName;", RetrieveClassName []. class.getName ());

4. מסקנה

במאמר זה בחנו ארבע שיטות לגישה לשם כיתה ב- Java. שיטות אלה הן: getSimpleName (), getName (), getTypeName () ו getCanonicalName ().

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

הקוד של מאמר זה ניתן למצוא באתר GitHub.


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