2013-02-13 18 views
0

我要以動態的方式我用下面的代碼來創建一個對象:動態對象創造

// Object technical name is xxxx.objectname 

String[] ObjectNameArray; 
ObjectNameArray = ObjectName.split("."); 

// if the objectname is for exaple deleteme Java should intrpet the code 
// as follows deleteme DeletebleObject = new deleteme(getContext()); 

ObjectNameArray[1] DeletebleObject = new ObjectNameArray[1](getContext()); 

這可能嗎?如何實現這一目標?

Thx提前。

+0

你有你的命名慣例向後 – yurib 2013-02-13 08:35:14

+0

你應該閱讀教程有關[Java反射API(http://docs.oracle.com/javase/tutorial/reflect/的index.html) – oliholz 2013-02-13 08:37:08

回答

0

通過Java反射:

String[] objectNameArray; 
    objectNameArray = objectName.split("."); 

    try { 
     Class<?> clazz = Class.forName(objectNameArray[1]); 
     Object context = getContext(); 
     Constructor<?> constructor = clazz.getConstructor(context.getClass()); 
     Object instance = constructor.newInstance(context); 

    } catch(ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch(SecurityException e) { 
     e.printStackTrace(); 
    } catch(NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch(IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch(InstantiationException e) { 
     e.printStackTrace(); 
    } catch(IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch(InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
0

您需要編寫一個類文件列表來創建動態對象。我要做的是創建一個Map,它將類名稱作爲鍵,將對象作爲值。他們我稱之爲地圖並獲取對象。

0
  1. 你的命名約定倒退了。
  2. 不知道如果多數民衆贊成你的意思,但你可以從它的名稱中使用得到一個類的實例:

    Class.forName("deleteMe").newInstance();

假設你的類有一個空的構造。 如果你想用一個參數的構造函數:

Class.forName("deleteMe").getConstructor(...).newInstance(...); 
0

我認爲你可以在這裏使用泛型...例如

MyClass <T extends Object> 

然後,您可以使用通配符訪問它們而不必關心它們的類型。

MyClass<?> myClass; 
0

看看反射包和Class類。他們有方法從現有的類定義創建對象。

Object o = Class.forName(ObjectNameArray[1]).newInstance(); 

newInstance()

創建此Class對象所表示的類的新實例。該類被實例化,就像通過一個帶有空參數列表的新表達式一樣。如果該類尚未初始化,則該類將被初始化。 請注意,此方法傳播由nullary構造函數拋出的任何異常,包括檢查的異常。使用此方法可以有效繞過編譯時異常檢查,否則編譯器會執行該異常。 Constructor.newInstance方法通過將構造函數拋出的任何異常包裝在(checked)InvocationTargetException中來避免此問題。

0

可以使用工廠設計模式來創建不同類型的動態對象由 發送名稱

爲REFFERENCE鏈接Factory Desing Pattern

0

也許你應該看看Java的「反射」機制是什麼並動態創建/調用您需要的對象/方法。看下面的例子:

// - specifies which class (className) is to be loaded (e.g.: com.example.objectname) 
Class<?> loca = Class.forName(className); 
// - specifies method (methodName) to be used (e.g.: getContext) 
// - assumes the method returns a "String" (String.class) 
Method method = loca.getMethod(methodName, new Class[]{String.class}); 
// - creates a new instance of the class, i.e., an object 
Object obj = loca.newInstance(); 
// - call the actual method in the function 
String result = (String) method.invoke(obj, inputParameters); 

希望它有幫助。