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

Main.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

私は OpenIDE のLookupメカニズムには詳しくありませんが、Java のメカニズムには精通していますServiceLoader

META-INF/services/どのクラスが特定のインターフェースを実装するかを説明するファイルをフォルダーに提供する必要があります。クラスを説明するJava ドキュメントから、次の例を示します。ServiceLoader

com.example.impl.StandardCodecsがサービスの実装である 場合com.example.CodecSet、その jar ファイルには次の名前のファイルも含まれます。

META-INF/services/com.example.CodecSet

このファイルには次の 1 行が含まれています。

com.example.impl.StandardCodecs # 実装する標準コーデックcom.example.CodecSet

不足しているのは、クラスパスまたは JAR ファイル内に含める必要がある同様のファイルです。

パッケージ名が含まれていないため、問題の解決に役立つより直接的な例を提供できません。

于 2015-06-14T07:49:35.710 に答える