ההבדל בין a.getClass () ל- A.class בג'אווה

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

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

במדריך זה נדון בהבדלים בין שתי דרכים שונות להשיג אובייקט java.lang.Class:

  • קורא ל Object.getClass () שיטה
  • משתמש ב .מעמד תחביר

2. מבוא קצר לשתי הגישות

ה Object.getClass () שיטה היא שיטת מופע של לְהִתְנַגֵד מעמד. אם יש לנו אובייקט, אנחנו יכולים להתקשר object.getClass () להשיג את מעמד אובייקט מסוגו.

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

@Test public void givenObjectAndType_whenGettingClassObject_thenTwoMethodsHaveTheSameResult () {String str = "אני אובייקט של מעמד String"; מחלקה fromStrObject = str.getClass (); קלאס כיתתי = String.class; assertSame (fromStrObject, clazz); } 

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

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

3. סוג זמן הריצה לעומת הסוג הסטטי

בואו נסקור את הדוגמה הקודמת במהירות. כשאנחנו קוראים str.getClass () שיטה, אנו מקבלים את סוג זמן הריצה של str לְהִתְנַגֵד. מצד שני, מחרוזת.מעמד מעריך את חוּט כיתה סטטית. בדוגמה זו, סוג זמן הריצה של str וה מחרוזת.מעמד אותו הדבר.

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

מעמד ציבורי בעלי חיים {מוגן int numberOfEyes; } מעמד ציבורי קוף מרחיב בעלי חיים {// דברים של קוף}

עכשיו בואו נקים אובייקט של ה- בעל חיים שיעורים ולעשות מבחן נוסף:

@Test הציבור בטל givenClassInheritance_whenGettingRuntimeTypeAndStaticType_thenGetDifferentResult () {בעלי חיים של בעלי חיים = קוף חדש (); זמן runtimeType = animal.getClass (); Class staticType = Animal.class; assertSame (staticType, runtimeType); } 

אם נריץ את הבדיקה לעיל, נקבל כישלון בבדיקה:

java.lang.AssertionError: .... צפוי: מחלקה com.baeldung.getclassobject. בעלי חיים בפועל: מחלקה com.baeldung.getclassobject.Monkey

בשיטת הבדיקה, גם אם מיידינו את ה- בעל חיים חפץ על ידי חיה מהחי = קוף חדש (); במקום חיית קוף = קוף חדש ();, סוג זמן הריצה של ה- בעל חיים האובייקט הוא עדיין קוֹף. הסיבה לכך היא ש בעל חיים אובייקט הוא מופע של קוֹף בזמן ריצה.

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

4. טיפול בסוגים פרימיטיביים

כשאנחנו כותבים קוד Java, אנו משתמשים בסוגים פרימיטיביים לעתים קרובות למדי. בואו ננסה להשיג א מעמד אובייקט מסוג פרימיטיבי באמצעות object.getClass () גִישָׁה:

מספר int = 7; Class numberClass = number.getClass ();

אם ננסה לקמפל את הקוד לעיל, נקבל שגיאת אוסף:

שגיאה: לא ניתן להפריש עם java: int

המהדר לא יכול להפריד בין מספר משתנה מכיוון שהוא משתנה פרימיטיבי. לָכֵן, ה object.getClass () השיטה לא יכולה לעזור לנו להשיג את מעמד אובייקט מסוג פרימיטיבי.

בואו נראה אם ​​נוכל להשיג את הסוג הפרימיטיבי באמצעות ה- .מעמד תחביר:

@ Test public void givenPrimitiveType_whenGettingClassObject_thenOnlyStaticTypeWorks () {Class intType = int.class; assertNotNull (intType); assertEquals ("int", intType.getName ()); assertTrue (intType.isPrimitive ()); } 

אז נוכל להשיג את מעמד האובייקט של int סוג פרימיטיבי דרך int.class. בג'אווה גרסה 9 ואילך, א מעמד אובייקט מהסוג הפרימיטיבי שייך ל java.base מודול.

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

5. קבלת השיעור ללא מקרה

למדנו שה- object.getClass () השיטה יכולה לתת לנו את מעמד אובייקט מסוג זמן הריצה שלו.

הבה נבחן את המקרה בו אנו רוצים להשיג א מעמד אובייקט מסוג, אך איננו יכולים להשיג מופע מסוג היעד מכיוון שהוא תַקצִיר כיתה, an מִמְשָׁק, או שכיתה כלשהי אינה מאפשרת ייצוב:

מחלקה מופשטת ציבורית SomeAbstractClass {// ...} ממשק SomeInterface {// כמה שיטות ...} מחלקה ציבורית SomeUtils {private SomeUtils () {לזרוק RuntimeException חדש ("מעמד Util זה אינו מורשה להיות מיידי!"); } // כמה שיטות סטטיות ציבוריות ...} 

במקרים אלה, איננו יכולים להשיג את מעמד אובייקטים מסוגים אלה באמצעות object.getClass () שיטה, אבל אנחנו עדיין יכולים להשתמש ב- .מעמד תחביר כדי להשיג את מעמד חפצים שלהם:

@Test הציבור בטל givenTypeCannotInstantiate_whenGetTypeStatically_thenGetTypesSuccefully () {Class interfaceType = SomeInterface.class; Class abstractClassType = SomeAbstractClass.class; Class utilClassType = SomeUtils.class; assertNotNull (interfaceType); assertTrue (interfaceType.isInterface ()); assertEquals ("SomeInterface", interfaceType.getSimpleName ()); assertNotNull (abstractClassType); assertEquals ("SomeAbstractClass", abstractClassType.getSimpleName ()); assertNotNull (utilClassType); assertEquals ("SomeUtils", utilClassType.getSimpleName ()); } 

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

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

6. מסקנה

במאמר זה למדנו שתי דרכים שונות להשיג את מעמד אובייקט מסוג: ה object.getClass () שיטה ו .מעמד תחביר.

בהמשך דנו בהבדל בין שתי הגישות. הטבלה הבאה יכולה לתת לנו סקירה ברורה:

object.getClass ()SomeClass.class
חפצי כיתהסוג זמן הריצה של לְהִתְנַגֵדהסוג הסטטי של SomeClass
טיפוסים פרימיטיבייםעובד ישר
ממשקים, שיעורים מופשטים או שיעורים שלא ניתנים לאינסטינציהעובד ישר

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


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