Java 从类实例化对象

Java 从类实例化对象,java,Java,我目前正在编写一个库,用户可以在其中创建父抽象类模块的自己的子类。 因此,库中已经包含了我编写的一些模块,例如ModuleOne,modulewo 每个模块-子类都应该可以很容易地用一个唯一的标识符来识别,例如一个整数,因为我想在一个xml文件中保存多个模块配置和连接。 因此,我可以稍后加载保存的配置并实例化所需类型的对象 如果我只使用预定义类,这很容易,因为我知道ModuleOne或modulewo的标识符,因此我可以在函数中创建模块: public static Module getModu

我目前正在编写一个库,用户可以在其中创建父抽象类
模块
的自己的子类。
因此,库中已经包含了我编写的一些模块,例如
ModuleOne
modulewo

每个
模块
-子类都应该可以很容易地用一个唯一的标识符来识别,例如一个整数,因为我想在一个xml文件中保存多个模块配置和连接。 因此,我可以稍后加载保存的配置并实例化所需类型的对象

如果我只使用预定义类,这很容易,因为我知道
ModuleOne
modulewo
的标识符,因此我可以在函数中创建模块:

public static Module getModuleByType(int type)
{
     if (type == ModuleOne.TYPE)
         return new ModuleOne();
     else if (type == ModuleTwo.TYPE)
         return new ModuleTwo();
     //and so on...
}
但是,如果用户创建了
Module
的子类,例如
CustomModule
,我如何为此类分配唯一标识符,以便此类的所有实例都具有相同的类型标识符

如何根据这些模块的标识符动态地重新创建它们?因此,我无法在
getModuleByType()
中创建模块,因为我不知道它们的构造函数和标识符


谢谢您的帮助。

您可以使用完整的类名(带包)作为标识符,并使用此

Class<?> clazz = Class.forName(className);
Module module = (Module)clazz.newInstance();
Class clazz=Class.forName(className);
Module Module=(Module)clazz.newInstance();

您可以使用完整的类名(与包一起)作为标识符,并使用此

Class<?> clazz = Class.forName(className);
Module module = (Module)clazz.newInstance();
Class clazz=Class.forName(className);
Module Module=(Module)clazz.newInstance();

我认为这不是一个好的设计。如何确保子类不重用已使用的类型?如果有人已经有了自己的子类及其唯一标识符,然后导入另一个库并发现它们有重复的标识符,该怎么办?您的设计容易出现几个错误

一般来说,您不可能做这样的事情,因为子类可能与其父类有很大差异


如果你不知道它们的构造函数,你永远不能实例化它们,因为你不知道它们的构造函数的参数是什么意思

一个相对有用的解决方案是“强制”子类有一个特定的构造函数,比如说没有arg构造函数,然后可以执行以下操作:

public static Module getModuleByType(final Class<? extends Module> moduleSubClass) {
    Constructor<? extends Module> ctor = moduleSubClass.getConstructor();
    return ctor.newInstance();
}

公共静态模块getModuleByType(final Class我认为这不是一个好的设计。如何确保子类不重用已使用的类型?如果有人已经有了自己的子类及其唯一标识符,然后导入另一个库并发现它们具有重复的标识符,该怎么办?您的设计容易出现几个错误

一般来说,您不可能做这样的事情,因为子类可能与其父类有很大差异


如果你不知道它们的构造函数,你永远不能实例化它们,因为你不知道它们的构造函数的参数是什么意思

一个相对有用的解决方案是“强制”子类有一个特定的构造函数,比如说没有arg构造函数,然后可以执行以下操作:

public static Module getModuleByType(final Class<? extends Module> moduleSubClass) {
    Constructor<? extends Module> ctor = moduleSubClass.getConstructor();
    return ctor.newInstance();
}

公共静态模块getModuleByType(最终类如果你不知道它们的构造函数,你就永远无法实例化它们,因为你不知道它们的构造函数的参数是什么意思。听起来你像是在重新创建Spring IOC。如果你不知道它们的构造函数,你就永远无法实例化它们,因为你不知道它们的构造函数的参数是什么意思。听起来像是一个重新创建Spring IOC。@m0skit0此对象将从
xml
重新创建,因此它必须具有默认构造函数。这毫无意义。这就像说:太阳是黄色的,所以西红柿是红色的。@m0skit0当我们通过JAXB从xml创建POJO时……所有这些POJO类都具有默认构造函数。所有数据都可以由setter指定。Where是OP指定他在使用JAXB吗?@m0skit0没有,当然,这是一个类比。:)@m0skit0此对象将从
xml
重新创建,因此它必须具有默认构造函数。这毫无意义。这就像说:太阳是黄色的,所以西红柿是红色的。@m0skit0当我们通过JAXB从xml创建POJO时……所有这些POJO类都具有默认构造函数。所有数据都可以由setter指定。OP在哪里指定他是u唱JAXB?@m0skit0没有,当然,这是一个类比。:)