2010-09-24 67 views
1

我是java編程語言的新手。我的問題是: 我想從控制檯讀取類名稱的sys.input。讀完類的名稱後,我想自動生成該類,如果該類已存在,則調用它的方法。 我的試用版在這裏。雖然我沒有得到任何錯誤,但沒有任何反應。 我的親切問候。在java中的反射?


class s1{ 
    public s1(){ 
     System.out.println(""+ s1.class); 
    } 
} 
public class reflection { 

    public static void main(String[] args) throws IOException, ClassNotFoundException{ 

     System.out.println("enter the class name : ");  
     BufferedReader reader= new BufferedReader(new InputStreamReader(System.in)); 
     String line = "reflection_N3."; 
     line+=reader.readLine(); 

     //System.out.println(line); 

    // "name" is the class name to load 
     Class clas = Class.forName(line);  
     clas.getClassLoader();  
    } 
} 
+0

你沒有對你加載的課程做任何事情。你預計會發生什麼? – 2010-09-24 10:32:55

回答

8

您未創建該類的實例。嘗試

Class clas = Class.forName(line); 
Object obj = clas.newInstance(); 

然而,問題是,你不能做很多與此對象,除非你知道它的確切類型,並把它轉換爲該類型。

在此示例中,您可以嘗試將其轉換爲您的班級類型,例如,

if (obj instanceof s1) { 
    s1 myS1 = (s1) obj; 
    myS1.s1(); 
} 

但是,這在現實生活中很難起作用,因爲在這種情況下,您事先不知道可能的類型。對此的典型解決方案是爲特定目的定義接口,並要求該類實現該接口。然後,可以將類實例向下轉換爲該接口(如果轉換失敗,則拋出異常),並調用其接口方法,而無需知道其具體類型。

或者,正如@helios指出的那樣,您可以使用反射來獲取具有特定名稱的加載類的方法。

順便說一下Java的約定是用大寫字母開始類名,因此S1Reflection

+2

或者使用反射來獲取方法,也是'class.getMethod(...);'並調用它'method.invoke(obj,...);' – helios 2010-09-24 10:37:17

+0

謝謝你的解決方法。注意命名課程。 – scratmiller 2010-09-24 10:50:15

2

你只能獲得ClassLoader,你從來沒有真正構造過指定類的對象。

如果您要調用默認構造函數,請使用clas.newInstance(),如果您需要調用特定構造函數,則調查Class.getConstructor(...)

+0

謝謝您的建議。 – scratmiller 2010-09-24 10:49:23