2012-02-24 39 views
0

說如果我有一個名爲Car的類,我可以在某些情況下使用下面的代碼行。Java運行時間級反射

Car.class

我的問題是有沒有辦法,如果用戶在運行時提供了一個類名,我可以做出同樣類型的呼叫。試過類似於下面的東西,但沒有喜悅,有沒有辦法可以做到這一點。

String className = "Car"; 
Class.forName(className).class; 

此外,我需要能夠動態地施放,如果用戶指定對象的列表,我需要能夠動態地投。

例如而不是Car myCar = (Car) object

我需要能夠讓用戶在運行時指定類的名稱/類型,以便我需要能夠沿ClassName myObj = (ClassName) object的行做些事情。

+1

可不可以給一個場景,在那裏你會用嗎? Java反射速度很慢,通常你不需要這種投射。也許有更好的方法來做到這一點? – Tim 2012-02-24 09:42:28

回答

0

您希望與myObj進行交互,所以不要考慮這些體操操作,可以考慮添加一個接口來模擬您想要與對象進行的交互,然後在代碼中使用該接口。然後可以驗證用戶提供的類來實現適當引發的必要接口和錯誤。

2

Class.forName("Car")已經返回相同的Car.class

對於鑄造,您可以使用Class.forName("Car").cast(object),這將返回一個Car對象。看看API,主要是java.lang.Class的一部分。

而且,因爲你鑄造@運行時,沒有類型安全,你應該檢查是否object擴展或做之前實現Car,否則你會得到一個異常。 A question I asked ~ a year ago and the answers there也可能與您有關。

雖然,因爲別人已經說過,這種氣味&你也許可以重新設計以更好的方式,請注意,此類型轉換通常會很慢,因爲Java需要檢查類型層次(它需要如果它不能投射到Car則拋出ClassCastException)。

0

表達式Car.class返回類Carjava.lang.Class對象。

聲明Class.forName("Car")也將返回Carjava.lang.Class對象(假設類Car是默認包)。注:不需要追加.class;那會給你ClassClass對象本身,這不是你想要的。

Class有方法來檢查對象是否是實例所代表的類的實例(希望這不是太混亂......)。由於您在編譯時不知道類Car的名稱,因此您不會有任何編譯時類型安全性。

查找java.lang.Class的API文檔。

1

您正在尋找的是一種名爲反射在Java編程語言中的功能。

它允許正在執行的Java程序檢查或「反思」自己,並操縱程序的內部屬性。例如,Java類可以獲取其所有成員的名稱並顯示它們。

http://java.sun.com

import java.lang.reflect.*; 

    public class DumpMethods { 
     public static void main(String args[]) 
     { 
     try { 
      Class c = Class.forName(args[0]); 
      Method m[] = c.getDeclaredMethods(); 
      for (int i = 0; i < m.length; i++) 
      System.out.println(m[i].toString()); 
     } 
     catch (Throwable e) { 
      System.err.println(e); 
     } 
     } 
    } 

一個簡單的示例有關的調用:

java DumpMethods java.util.Stack 

輸出爲:

public java.lang.Object java.util.Stack.push(
    java.lang.Object) 
    public synchronized 
    java.lang.Object java.util.Stack.pop() 
    public synchronized 
     java.lang.Object java.util.Stack.peek() 
    public boolean java.util.Stack.empty() 
    public synchronized 
    int java.util.Stack.search(java.lang.Object) 

這裏是在運行時創建對象的示例:

import java.lang.reflect.*; 

    public class constructor2 { 
     public constructor2() 
     { 
     } 

     public constructor2(int a, int b) 
     { 
     System.out.println(
      "a = " + a + " b = " + b); 
     } 

     public static void main(String args[]) 
     { 
     try { 
      Class cls = Class.forName("constructor2"); 
      Class partypes[] = new Class[2]; 
      partypes[0] = Integer.TYPE; 
      partypes[1] = Integer.TYPE; 
      Constructor ct 
       = cls.getConstructor(partypes); 
      Object arglist[] = new Object[2]; 
      arglist[0] = new Integer(37); 
      arglist[1] = new Integer(47); 
      Object retobj = ct.newInstance(arglist); 
     } 
     catch (Throwable e) { 
      System.err.println(e); 
     } 
     } 
    } 

你可以閱讀更多關於它herehere - for indepth view

也看這裏: What is reflection and why is it useful?