2013-02-13 17 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); 

希望它有帮助。