Java 从数据库中的限定名称创建类

Java 从数据库中的限定名称创建类,java,database,Java,Database,我正在从事一个smarthouse项目,该项目有一系列设备,通过连接到串行端口的无线适配器进行通信。在启动时,我想从数据库中加载远程设备列表,其中存储了它们的限定名称。远程设备的示例有门传感器、运动传感器、加热系统。。。。所有远程设备都是RemoteDevice类的子类,因为它们使用相同的硬件进行通信 问题是在运行时,我不知道数据库中会有哪些设备,这应该动态完成。我发现了其他的例子可以说明这一点: public static void main(String[] args) throws Exc

我正在从事一个smarthouse项目,该项目有一系列设备,通过连接到串行端口的无线适配器进行通信。在启动时,我想从数据库中加载远程设备列表,其中存储了它们的限定名称。远程设备的示例有门传感器、运动传感器、加热系统。。。。所有远程设备都是RemoteDevice类的子类,因为它们使用相同的硬件进行通信

问题是在运行时,我不知道数据库中会有哪些设备,这应该动态完成。我发现了其他的例子可以说明这一点:

public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("test.Demo");
        Demo demo = (Demo) clazz.newInstance();

然而,我不知道我将得到哪个类,可能有十几种设备类型,而且我的类没有默认构造函数。我的加载方法如下所示

public void loadDatabase(Connection dbConn) throws SQLException
{
    String query = "SELECT * FROM smartHouse.device AS dev ";

    try
    {
        Statement statement = dbConn.prepareStatement(query);
        ResultSet devices = statement.executeQuery(query);

        while(devices.next())
        {
            int id = devices.getInt("id");
            String address = devices.getNString("HW Address");
            String classpath = devices.getNString("ClassPath");
            //parse classpath, create remote object instances and add them to device ArrayList
        }
    }
    catch(Exception e)
    {
    }
}

如果有任何帮助,我们将不胜感激。

像这样的工厂方法如何:

RemoteDevice createDevice (String className, String hardwareAddress) {
    Class clazz = Class.forName(className);
    RemoteDevice newDevice = (RemoteDevice) clazz.newInstance();
    newDevice.setHardwareAddress(hardwareAddress);
}
这显然需要基类RemoteDevice中的setter setHardwareAddress和每个继承器中的默认构造函数

如果构造函数中始终有相同的参数,则工厂方法可能如下所示:

RemoteDevice createDevice (String className, String hardwareAddress) throws Exception {
    Class clazz = Class.forName(className);

    Constructor<RemoteDevice> constructor = clazz.getConstructor(new Class[]{String.class});
    RemoteDevice result = constructor.newInstance(hardwareAddress);
    return result;
}

这有帮助吗?

而且我的类没有默认构造函数-那么你怎么知道要传递给构造函数的参数呢?在这种情况下,使用反射是昂贵的、不安全的,也是不合理的。您可以创建一个工厂,它接收设备名称并返回相关类的实例@alfasin和默认构造函数下的saferJon我指的是不带参数的构造函数,这对我来说是个糟糕的解释。构造器总是使用硬件地址和ids,这稍微澄清了一些事情,但有一点我仍然不清楚;如果我将温度传感器等向上转换到远程设备,则覆盖的方法对我可用。我关心的是:RemoteDevice和Temperature sensor都有一个名为parseNotification的方法,该方法处理来自远程设备的通知。远程设备只是记录它,而温度传感器解析输入,进行一些计算等。因此,如果我调用RemoteDevice.ParseNotification升级的温度传感器上的一些参数,远程设备方法会响应还是温度传感器方法会响应我一直在挖掘,我已经找到了答案,而您编写的内容适合。多谢各位。