在 Java 中动态创建对象

发布于 2024-10-15 16:43:34 字数 438 浏览 1 评论 0原文

有没有(更好的)方法来动态创建对象?

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

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

Is there a (better) way to dynamically create Objects?

Right now I'm using a simple 'factory pattern' solution as following:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

暗恋未遂 2024-10-22 16:43:34

这段代码不是工厂模式,也没有创建任何对象。您计算类名并调用类上的静态方法。


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

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

但也许我仍然不明白您的想法.. .)

This code is not a factory pattern and no object is created. You evaluate the class name and call a static method on a class.


Now it looks like you have an object (generalObject) and want to create a new instance of the very same type. If all possible types have a public default constructor (convention!), then you can use this to create a new instance based on the given object:

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

(but maybe I still didn't get your idea...)

无语# 2024-10-22 16:43:34

你可以在这里使用反射,类似

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

应该做的事情。

You could use reflection here, something like

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

should do.

故笙诉离歌 2024-10-22 16:43:34
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);
}
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);
}

This is very complicated. Since apparently both classes are on your compile classpath, just use the class objects, not their string representations:

Class<?> classType = generalObject.getClass();
if(UserObject.class.equals(classType)) {
    return UserObject.fromByteArray(data);
}else if(NewsObject.class.equals(classType)) {
    return NewsObject.fromByteArray(data);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文