כיצד להשיג שם של שיטה שמבוצעת?

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

לפעמים עלינו לדעת את שמה של שיטת Java הנוכחית שמבוצעת.

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

2. Java 9: ​​API-Stack-Walking

ג'אווה 9 הציגה את ה- API של Stack-Walking כדי לחצות את מסגרות הערימה של JVM בצורה עצלה ויעילה. על מנת למצוא את השיטה המבוצעת כעת עם API זה, אנו יכולים לכתוב מבחן פשוט:

חלל ציבורי givenJava9_whenWalkingTheStack_thenFindMethod () {StackWalker walker = StackWalker.getInstance (); Methodational אופציונלי = walker.walk (frames -> frames .findFirst () .map (StackWalker.StackFrame :: getMethodName)); assertTrue (methodName.isPresent ()); assertEquals ("givenJava9_whenWalkingTheStack_thenFindMethod", methodName.get ()); }

ראשית, אנו מקבלים א סטאק ווקר למשל באמצעות getInstance () שיטת מפעל. ואז אנו משתמשים ב- לָלֶכֶת() שיטה לחצות את מסגרות הערימה מלמעלה למטה:

  • ה לָלֶכֶת() שיטה יכולה להמיר זרם של מסגרות מחסנית - זרםלכל דבר
  • האלמנט הראשון בזרם הנתון הוא המסגרת העליונה בערימה
  • המסגרת העליונה בערימה מייצגת תמיד את השיטה המבוצעת כעת

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

2.1. יתרונות

בהשוואה לגישות אחרות (עליהן בהמשך), ל- API של Stack-Walking יש כמה יתרונות:

  • אין צורך ליצור מופע מחלקה פנימי אנונימי דמה - אובייקט חדש (). getClass () {}
  • אין צורך ליצור חריג דמה - חדש זורק ()
  • אין צורך לתפוס בשקיקה את כל ערימת המסלול, מה שעלול להיות יקר

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

בשורה התחתונה, השתמש ב- API של Stack-Walking אם אתה נמצא ב- Java 9+.

3. שימוש getEnclosingMethod

אנו יכולים למצוא את שם השיטה המבוצעת באמצעות ה- getEnclosingMethod () ממשק API:

חלל ציבורי givenObject_whenGetEnclosingMethod_thenFindMethod () {String methodName = new Object () {} .getClass () .getEnclosingMethod () .getName (); assertEquals ("givenObject_whenGetEnclosingMethod_thenFindMethod", methodName); }

4. שימוש זורק ערימת עקבות

באמצעות א זורק מעקב מחסנית נותן לנו מעקב מחסנית בשיטה המתבצעת כעת:

חלל ציבורי givenThrowable_whenGetStacktrace_thenFindMethod () {StackTraceElement [] stackTrace = חדש Throwable (). getStackTrace (); assertEquals ("givenThrowable_whenGetStacktrace_thenFindMethod", stackTrace [0] .getMethodName ()); }

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

כמו כן, עקבות הערימה של שרשור הנוכחי (מאז JDK 1.5) כוללת בדרך כלל את שם השיטה שמבוצעת:

חלל ציבורי givenCurrentThread_whenGetStackTrace_thenFindMethod () {StackTraceElement [] stackTrace = Thread.currentThread () .getStackTrace (); assertEquals ("givenCurrentThread_whenGetStackTrace_thenFindMethod", stackTrace [1] .getMethodName ()); }

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

6. מסקנה

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

כמו תמיד, תוכל לבדוק את הדוגמאות המופיעות במאמר זה ב- GitHub. כמו כן, דוגמאות Java 9 זמינות במודול Java 9 GitHub שלנו.