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());

这可能吗?以及如何做到这一点?

提前谢谢。

4

7 回答 7

0

无论如何,您都需要编写类文件列表来创建动态对象。我要做的是创建一个 Map ,其中将类名作为键,将对象作为值。他们我调用地图并获取对象。

于 2013-02-13T08:34:26.973 回答
0
  1. 您的命名约定倒退了。
  2. 不确定这是否是您的意思,但是您可以使用以下方法从其名称中获取类实例:

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

假设你的类有一个空的构造函数。如果要使用参数化构造函数:

Class.forName("deleteMe").getConstructor(...).newInstance(...); 
于 2013-02-13T08:37:34.773 回答
0

我认为您可以在这里使用泛型...例如

    MyClass <T extends Object>

然后,您可以使用通配符访问它们而无需关心它们的类型。

    MyClass<?> myClass;
于 2013-02-13T08:39:56.943 回答
0

查看反射包和Class类。它们具有从现有类定义创建对象的方法。

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

newInstance()

创建由此 Class 对象表示的类的新实例。该类被实例化为一个带有空参数列表的新表达式。如果尚未初始化该类,则将其初始化。请注意,此方法传播由 nullary 构造函数引发的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译器执行的编译时异常检查。Constructor.newInstance 方法通过将构造函数抛出的任何异常包装在(已检查)InvocationTargetException 中来避免此问题。

于 2013-02-13T08:40:28.247 回答
0

您可以使用工厂设计模式通过发送名称来创建不同类型的动态对象

参考链接工厂设计模式

于 2013-02-13T08:40:56.780 回答
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);

希望能帮助到你。

于 2013-02-13T08:46:22.127 回答
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();
    }
于 2013-02-13T08:48:52.207 回答