org.openide.util.Lookup 找不到任何 类 实施
org.openide.util.Lookup Cannot Find Any Classes Implementing
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();
}
Main.java:
public class Main {
public static void main(String[] args) {
DBDriver d = SQLUtils.getDriver("mysql");
}
}
这在 运行 时什么都不做,它找不到任何 类 实现。
该程序试图做的是获取作为 SQLUtils.getDriver(字符串前缀)(在 Main.java 中)的参数输入的驱动程序。
出于某种原因,我无法让它工作。
我不熟悉OpenIDE Lookup
机制,但我熟悉Java ServiceLoader
机制
您需要在 META-INF/services/
文件夹中提供一个文件,描述 class 实现特定接口的内容。从 Java Docs 描述 ServiceLoader
class 是这个例子:
If com.example.impl.StandardCodecs
is an implementation of the
com.example.CodecSet
service then its jar file also contains a file
named
META-INF/services/com.example.CodecSet
This file contains the single line:
com.example.impl.StandardCodecs # Standard codecs implementing com.example.CodecSet
您缺少的是需要包含在您的 class 路径或 JAR 文件中的类似文件。
您没有包含包名称,因此我无法提供更直接的示例来帮助您解决问题。
我放弃了 NetBeans API 并切换到 Reflections。我用 IntelliJ 实现了 Maven 和 运行。对我来说效果很好。
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();
}
Main.java:
public class Main {
public static void main(String[] args) {
DBDriver d = SQLUtils.getDriver("mysql");
}
}
这在 运行 时什么都不做,它找不到任何 类 实现。 该程序试图做的是获取作为 SQLUtils.getDriver(字符串前缀)(在 Main.java 中)的参数输入的驱动程序。 出于某种原因,我无法让它工作。
我不熟悉OpenIDE Lookup
机制,但我熟悉Java ServiceLoader
机制
您需要在 META-INF/services/
文件夹中提供一个文件,描述 class 实现特定接口的内容。从 Java Docs 描述 ServiceLoader
class 是这个例子:
If
com.example.impl.StandardCodecs
is an implementation of thecom.example.CodecSet
service then its jar file also contains a file namedMETA-INF/services/com.example.CodecSet
This file contains the single line:
com.example.impl.StandardCodecs # Standard codecs implementing
com.example.CodecSet
您缺少的是需要包含在您的 class 路径或 JAR 文件中的类似文件。
您没有包含包名称,因此我无法提供更直接的示例来帮助您解决问题。
我放弃了 NetBeans API 并切换到 Reflections。我用 IntelliJ 实现了 Maven 和 运行。对我来说效果很好。