2015-05-03 52 views
0

目前我有以下方法來實例化對象。我正在從文件中讀取類名,並使用大寫字母。 (我可以假設不會有像Abc.java,ABC.javaaBc.java這樣的許多類,並且將只有一個類,其名稱包含a,b,c給定順序的字母)。創建具有文件名大小寫的java類實例不敏感

作爲一個例子有一名爲SchoolPrincipal Java類此類文件爲SCHOOLPRINCIPAL中表示目前所以我下面的方法無法找到該對象由於大寫問題,它給ClassNotFoundException

我不能重命名java類,它應該與標準保持一致,而且我也無法更改大寫文件中的單詞。有沒有一個棘手的方法來解決這個問題。

而且我有一個解決方案,並想知道在這個解決方案的好壞, 獲取所有的Java類名和存儲在一個地圖,關鍵是所有大寫(key: CLASSTEACHER, Value: ClassTeacher),當我從文件中讀取我的名字在地圖中搜索並獲取值並將className傳遞給以下方法。

public Object getInstance(String packageName, String className) 

     String unifiedClassName = packageName + "." + className; 
     LOG.info("Creating " + unifiedClassName + " instance..."); 

     Class<?> clazz = null; 
     Constructor<?> ctor = null; 
     Object obj = null; 

     try { 

      clazz = Class.forName(unifiedClassName); 
      ctor = clazz.getConstructor(); 
      obj = ctor.newInstance(); 

     } catch (InstantiationException e) { 
      LOG.error("Error occurred: " + e); 
     } 
} 
+0

我認爲你從接近您的問題一個錯誤的觀點。有很多課程你不能親自改變他們的案例嗎?如果是這樣,請製作一個簡單的程序,通過源文件夾並使用正確的文件名爲您生成一個新文件。 – NeoMime

+0

您可以使用所有可能的選項執行'Class.forName'調用。或者遍歷該包中的文件並找到一個具有相同名稱的文件。不知道你想要做什麼,但聽起來不是一個非常好的概念。 – Bubletan

+0

@NeoMime相應的類在一個包中,並且有一千到五千個類 –

回答

2

有趣的問題......我認爲,如果你採取這種方法,主要的挑戰將是實際得到的類路徑中的所有可用類(恕我直言,它仍然會比試圖名的所有2^n種組合更有效)。

也許你已經熟悉類路徑掃描,所以你省略了它,因爲它很明顯?我在想是這樣Get all of the Classes in the Classpath,或尋找到那些掃描其他第三方(如彈簧或JUnit的)

無論如何,這將是一個有趣的線程跟隨:)

+0

相應的課程在一個包中,並且有一千到五千個課程 –