用Java动态创建对象

时间:2011-02-03 10:35:45

标签: java design-patterns object

是否有(更好的)动态创建对象的方法?

现在我正在使用一个简单的“工厂模式”解决方案:

   String classType = generalObject.getClass().toString();

    if(classType.equals("class be.testApp.UserObject")) {
        return UserObject.fromByteArray(data);
//return new UserObject();
    }
    else if(classType.equals("class.be.testApp.NewsObject"))    {
        return NewsObject.fromByteArray(data);
//return new NewsObject();      
    }

3 个答案:

答案 0 :(得分:6)

此代码不是工厂模式,也不会创建任何对象。您评估类名并在类上调用静态方法。


现在看起来你有一个对象(generalObject)并且想要创建一个相同类型的新实例。 如果所有可能的类型都有一个公共默认构造函数(约定!),那么您可以使用它来创建基于给定对象的新实例:

Object newObject = generalObject.getClass().newInstance();

(但也许我仍然没有得到你的想法......)

答案 1 :(得分:1)

你可以在这里使用反射,比如

final Class<?> clazz = generalObject.getClass();
final Method method = clazz.getMethod("fromByteArray", data.getClass());
return method.invoke(null, data);

应该这样做。

答案 2 :(得分:0)

String classType = generalObject.getClass().toString();
if(classType.equals("class be.testApp.UserObject")) {
    return UserObject.fromByteArray(data);
}else if(classType.equals("class.be.testApp.NewsObject"))    {
    return NewsObject.fromByteArray(data);
}

这非常复杂。因为显然这两个类都在你的编译类路径上,所以只使用类对象,而不是它们的字符串表示:

Class<?> classType = generalObject.getClass();
if(UserObject.class.equals(classType)) {
    return UserObject.fromByteArray(data);
}else if(NewsObject.class.equals(classType)) {
    return NewsObject.fromByteArray(data);
}