1

SQLUtils.java:

import org.openide.util.Lookup;

import java.util.ServiceLoader; // This doesn't work either

public class SQLUtils {
    public static DBDriver getDriver(String prefix) {
        for(DBDriver e : Lookup.getDefault().lookupAll(DBDriver.class)) {
            System.out.println(e.getPrefix());
            if(e.getPrefix().equalsIgnoreCase(prefix)) {
                return e;
            }
        }
        return null;
    }
}

MySQLDriver.java:

public class MySQLDriver implements DBDriver {
    @Override
    public String getPrefix() {
        return "mysql";
    }
}

DBDriver.java:

import java.io.Serializable;

public interface DBDriver extends Serializable {
    public String getPrefix();
}

主.java:

public class Main {
    public static void main(String[] args) {
        DBDriver d = SQLUtils.getDriver("mysql");
    }
}

这在运行时什么都不做,它找不到任何实现的类。程序试图做的是获取作为 SQLUtils.getDriver(String prefix) 参数输入的驱动程序(在 Main.java 中)。出于某种原因,我无法让它工作。

4

2 回答 2

0

我不熟悉OpenIDELookup机制,但熟悉JavaServiceLoader机制。

您需要在META-INF/services/文件夹中提供一个文件来描述哪些类实现了特定的接口。来自描述该类的Java DocsServiceLoader是这个例子:

如果com.example.impl.StandardCodecscom.example.CodecSet服务的实现,那么它的 jar 文件还包含一个名为

META-INF/services/com.example.CodecSet

该文件包含一行:

com.example.impl.StandardCodecs # 标准编解码器实现com.example.CodecSet

您缺少的是需要包含在类路径或 JAR 文件中的类似文件。

您没有包含包名称,因此我无法提供更直接的示例来帮助解决您的问题。

于 2015-06-14T07:49:35.710 回答
0

我放弃了 NetBeans API 并切换到反射。我实现了 Maven 并使用 IntelliJ 运行它。对我来说效果很好。

于 2015-06-20T02:12:36.197 回答