2012-01-24 246 views
0

我有一些類和出於某種原因,我需要的是創建一個類dinamically的一些變量的過程......定義一個變量類型另一個變量在Java中

假設我有這樣的代碼:

for (int i = 0 ; i < 5 ; i++) 
{ 
    .... 
    POP tmp = new POP(); 
    tmp = (POP) ast.convert(aso, POP.class);  
} 

我想的是,POP類設置dinamically ......我幾乎實現了我想除了從對象類鑄件是什麼,我不知道該怎麼寫呢?

String className = "POP"; 
Class cl = Class.forName(className); 
Class cl2 = POP.class; 
cl = (??????) ast.convert(aso, cl2); 

我怎麼能解決它?

+2

您能否提供更多的代碼?說實話:我仍然在猜測你想要在這裏實現什麼:) .convert()方法在做什麼?什麼是「aso」? – chzbrgla

+0

對於這段代碼,'??????'應該是'Class',但我不認爲這就是你想要的:-)你可以通過聲明'cl'來實現你想要的接口類型由你的類實現。 – rsp

回答

1

在你的第二個代碼片段中,cl實際上是Class<POP>,但是cl2是Class<String>,我猜這不符合你的期望。假設您使用Java 5或更新版本進行編碼,則不應使用原始類型(Class而不是Class<?>),這將使您的代碼更安全,更易於閱讀。

另請注意,您必須使用完全限定的類名稱,而不僅僅是類的簡單名稱。例如

Class.forName("String"); // Won't work 
Class.forName("java.lang.String"); // Is what you need. 

當你有,你可以使用反射動態創建新實例的類實例:

Class<?> cl2 = ... ;   

    // If the class has a no-arg visible constructor 
    Object foo = cl2.newInstance(); 

    // Or using an explicit constructor (here with an integer and a String as arguments) 
    Constructor<Class<?>> cons = cl2.getConstructor(Integer.class, String.class); 
    Object bar = cons.newInstance(1, "baz"); 

但是,也許你正在嘗試實現可以​​用抽象工廠模式來完成?您提供了一個能夠創建所需類型實例的對象,並且您可以根據類名稱選擇要使用的工廠。

http://c2.com/cgi/wiki/wiki?AbstractFactoryPattern

+0

謝謝你,你幫了我很多......最後一個問題..如果類有一個方法(即。getdetails())我怎麼能從Object foo調用它?!? – Marcx

+0

您可以在您的類(不是實例!)上使用'getDeclaredMethod()',它將返回一個Method實例。然後,您可以使用foo作爲第一個參數,在此方法實例上調用'invoke'。 http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html – ARRG

+0

但是在大多數情況下使用這種反射並不是必要的,而且是不實用,不安全和低效的。我很確定你想要達到的目標可以通過更好的方式解決。 – ARRG

相關問題