2011-08-30 53 views
2

我想在運行時創建java類(它們都是擴展超類)的實例。如何獲得一個子類實例,當我知道在java中的類名稱作爲字符串?

這裏是一些實例類:

class Super { 
} 

class FirstSub extends Super { 
} 

class SecondSub extends Super { 
} 

我知道類名作爲字符串:

String name = "SubClassName"; 

這是我的第一種方法:

Super foo; 
if (FirstSub.class.getSimplename().equals(name)) { 
    foo = new FirstSub(); 
} 
if (SecondSub.class.getSimplename().equals(name)) { 
    foo = new SecondSub(); 
} 

我如何獲得一個實例其中一個「子類」以更復雜的方式?

編輯:另外我想要演員fooSubClassName

+0

[Dynamic Class loading with Java](http://stackoverflow.com/questions/7220601/dynamic-class-loading-with-java) – amit

回答

9
Class myClass = Class.forName(name); 
Object o = myClass.newInstance(); 
Super instance = (Super)o; 
//Subclass instance2 = (Subclass)o; 

動態地轉換你的變量引用將是子類是不可能的和不值得的。如果在這個地方你的對象可能是FirstSub或SecondSub,那麼這個對象都應該提供一些給定的功能(方法)。您應該在超類中定義一些(例如抽象)方法(或使其成爲接口)。然後,如果你有這樣一行:

Super instance = (Super)o; 

其中O是超級的子類,然後調用你的方法將調用方法的子類的實例。這是多態

+1

'Class class'? 'class'是java中的一個受保護的關鍵詞,這段代碼不會編譯 – amit

+1

謝謝 - 編輯 –

+2

+1:注意:newInstance()會拋出一個檢查異常,就好像存在未經檢查的異常這種令人驚訝的行爲。你應該在它周圍放置一個try/catch(Exception)塊。 –

0

這裏的美是例如

try{ 
    Class my_class = Class.forName(class_name); 
    // use my_class object to 
    Object initClassObj = my_class.newInstance(); 
}catch(ClassNotFoundException ex){ 
    // handle exception 
}catch(Exception ex){ 
    // handle other exception 
} 
+0

;)對於標題(一個已知類名稱的Class類的實例),這是正確的,但它看起來像是,問題是關於實例化 –

3
Super s = (Super) Class.forName(str).newInstance(); 

我想這會工作。

+0

@peter ...感謝編輯... – amod

相關問題