2011-04-01 91 views
3

世界!我需要從它的Class的名字實例化一個Object。我知道這是可能的,這樣做如何從不完整的類名獲取實例化對象?

MyObject myObject = null; 
try { 
    Constructor constructor = Class.forName("fully.qualified.class.name" ).getConstructor(); // Get the constructor without parameters 
    myObject = (MyObject) constructor.newInstance(); 
} catch (Exception e) { 
    e.printStackTrace(); 
}  

問題是,我的班的名字是不完全合格的。有沒有辦法通過只知道短名稱來獲得完整的名稱?

+0

該課程是否已加載? B/c,那麼你可以列出所有加載的類並與它們進行比較......但我必須問,爲什麼這是必要的?也許有一個更好的解決方案,以解決更高級別的問題 – 2011-04-01 13:02:13

回答

2
MyObject myObject = null; 
for (Package p : Package.getPackages()) { 
    try { 
     myObject = Class.forName(p.getName() + "." + className).newInstance(); 
     break; 
    } catch (ClassNotFoundException ex) { 
     // ignore 
    } 
} 

Package.getPackages()電話會給你每包知道當前類的ClassLoader 及其祖先

警告:這將是昂貴的,因爲你反覆拋出和捕捉異常。有可能通過測試加速它:

this.getClass().getClassLoader().findResource(binaryClassName) != null 

在致電Class.forName(...)或等效。

+0

好,謝謝!僅供參考,p.getName()和className之間缺少'+「。」'。 – tunnuz 2011-04-01 14:52:24

+0

謝謝 - 修復它 – 2011-04-01 14:56:59

1

對於包搜索路徑反覆嘗試此操作。 ;)

String[] packages = ...; 
String className = ...; 
MyObject myObject = null; 
for(String p : packages) 
    try { 
    myObject = Class.forName(p + '.' + className).newInstance(); 
    break; 
    } catch (Exception ignored) { 
    } 
+0

這可能是完全按照要求完成的唯一方法,但我只會捕獲特定的異常,即ClassNotFoundEx或任何....您不想隱藏其他問題... – 2011-04-01 13:03:47

+0

@Java Drinker,這是真的,如果一個失敗的構造函數有副作用,你也可以得到副作用。以這種方式使用newInstance()的缺點之一是它也可能拋出CNFE。 (儘管相當偏執於擔心),即這個newInstance()不包裝檢查的異常。 – 2011-04-01 13:06:37