Java - forName

Metheny

Member
Java - forName

יש את הפונקציה :
Class.forName(String)​
שמחזירה אובייקט של Class שמתאים למחלקה שכתוב ב- String. אם קיימת מחלקה כזאת, אז הוא מחזיר מה שצריך. אם לא, הוא זורק ClassNotFoundException. אבל אם ה-String מכיל שם של מחלקה קיימת אבל לא ב- case sensitive, הוא מנסה לעשות משהו אבל לא מצליח, וזה זורק NoClassDefFoundError. הבעייה היא שאני רוצה שהוא יזהה את המחלקה גם אם זה לא case sensitive. מישהו יודע איך אפשר להתגבר על הבעייה הזאת?
 

אלדד28

New member
אין דרך נוחה לעשות את זה.

מנגנון ה-REFLECTION של JAVA הוא CASE SENSITIVE. אם לא תיתן class שקיים באמת - תיכשל בכל מקרה. הדרך היחידה שלך היא לבדוק את כל האפשרויות עד שתצליח, שזה אומר 2 בחזקת N, כאשר N הוא אורך המחרוזת
 

Metheny

Member
כן הבעייה היא ש...

יש הבדל בין התוצאה כשלא קיים קלאס בשם הזה לבין התוצאה כשקיים קלאס בשם הזה רק שחלק מהאותיות לא ב- case הנכון... זה מה שמעצבן אותי. תודה
 
מה עושה getClasses?

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

Metheny

Member
getClass

אתה יכול להשתמש בזה רק כשיש לך כבר אובייקט, ואז זה מחזיר לך אובייקט Class שמכיל מידע על המחלקה שהאובייקט שייך אליה. אצלי הייתה בעייה בייצור אובייקט Class בהינתן String מסויים שאמור לייצג שם של מחלקה ידועה.
 
לא getClass - אלא getClasses...

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

Metheny

Member
נראה ש...

זה מחזיר מחלקות פנימיות של המחלקה שקוראת לפונקציה.
 

Metheny

Member
מה אתם אומרים על זה?

כשהוא זורק לי את ה- NoClassDefFoundError , הוא מצרף לזה message. נגיד שקיימת מחלקה שקוראים לה MyClass, ועשיתי:
Class c = Class.forName("mYcLasS");​
אז הוא זורק לי את ה-NoClassDefFoundError עם ההודעה:
mYcLasS (wrong name: MyClass)​
כלומר הוא כותב לי בהודעה את שם המחלקה הנכון. חשבתי אולי להוציא מתוך ההודעה הזאת את שם המחלקה הנכון, וממנו לייצר אובייקט. אתם חושבים שלעשות דבר כזה זה תכנות רע?
 
האמת?...../images/Emo26.gif

כל השרשור הזה לא ממש ברור לי... למה אתה צריך את זה?... אולי תיתן לנו קצת רקע על מה אתה מנסה לעשות...
 

Metheny

Member
ככה..

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