2016-05-18 42 views
3

這是一個跟進這個問題:Create new class from a Variable in Java創建和使用類從變量

我想加載基於字符串變量,它的工作原理一類,但我不能把它的任何方法。

我有多個類都實現相同的接口,例如,

class Foo implements Bar { 
    private String username = null; 

    public String getUsername() { 
     return this.username; 
    } 
} 

現在我想將類實例不知道哪一個是,然後調用getUsername()就可以了。

String a = "Foo"; 
Class<?> c = Class.forName(a); 
Object object = c.newInstance(); 
System.out.println(object.getUsername()); 

這導致

Error:(74, 15) java: cannot find symbol

symbol: method getUser()

location: variable object of type java.lang.Object

如果我將它轉換爲類像

Foo foo = (Foo) object; 

它的工作原理,但我不能這樣做,因爲我不知道班級' 名稱。

有沒有辦法做到這一點或完全是一個虛假的嘗試?

+1

你怎麼知道getUsername()應該存在?它是來自一個接口或抽象類,你知道你的實例將實現/擴展? – AxelH

+0

是的,這是衆所周知的,因爲它們都實現了一個接口@AxelH – baao

+0

如果你不能通過'c.newinstance()'來檢索你檢索的對象,那麼你必須使用反射來獲取getUsername()方法。 – Turing85

回答

3

你應該把它投放到您的接口:Bar object = (Bar) c.newInstance()

+0

你現在不是課程名稱。但你必須現在你的界面。沒有這個,你不能調用任何方法。 – Nikem

2

只是要多一點安全,可以檢查,如果轉換是可能的。

public static void main(String arg[]) throws Exception { 
    String a = "Test"; 
    Class<?> c = Class.forName(a); 
    if(ITest.class.isAssignableFrom(c)){ 
     ITest object = (ITest) c.newInstance(); 
     System.out.println(object.sayHello()); 
    } else { 
     System.out.println("Good bye"); 
    } 
} 

接口爲:

public interface ITest { 
    public String sayHello(); 
} 

和類是:

public class Test implements ITest{ 

    @Override 
    public String sayHello(){ 
     return "Hello World"; 
    } 
} 

這將檢查如果轉換是可能通過檢查生成的類是與具有層次鏈接界面。這可以用try catch來完成,但是這樣更漂亮;)