7

ジョブの実行をスケジュールするために、クラスの名前を文字列入力として取得します。
このクラスは 2 つのパッケージのいずれかに含まれている可能性がありますが、どちらのパッケージかわからないため、これを確認する必要があります。

今では、2 つの try-catch-blocks があります

Class<Job> clazz;
String className; //the above mentioned string, will be initialized

try {
    clazz = (Class<Job>) Class.forName("package.one." + className);
} catch (ClassNotFoundException ex) {
    try {
        clazz = (Class<Job>) Class.forName("package.two." + className);
    } catch (ClassNotFoundException ex1) {
      //some error handling code here, as the class is
      //in neither of the two packages
    }
}

より多くのパッケージでは、これはより醜く、より読みにくくなります。さらに、例外はフロー制御に期待/使用されるべきではないため、私にとっては例外の概念に反しています!
を利用せずにこれを書き直す方法はありますClassNotFoundExceptionか?

4

4 に答える 4

5

私はそのためのClass.forName方法に固執します。

Collectionクラス名とパッケージ名をs またはsに格納して、Setそれらの要素をループできます。を取得したらClassNotFoundException、検索を続行します。例外が発生しない場合は、break探していたクラスが見つかったので、 を使用してループを終了します。

私が行く理由Class.forNameは、VM によってクラスがまだロードされていない場合にクラスをロードするためです。これはかなり強力な副作用です。

基本的には、全体を掘り下げてCLASSPATHVM にロードするクラス ファイルを探したり、クラスが VM によって既にロードされているかどうかなどの問題に対処したりする手間から解放されます。

編集:

Jakob Jenkov は、Java に関する非常に優れた記事やチュートリアルを書いています。リフレクション、クラス・ローダー、および並行性 (Java の「最も難しい」側面の一部) を処理するときに、これらが非常に役立つことがわかりました。

Java クラス・ローダーに関する彼の記事は、まだ使用しないことに決めた場合に役立ちますClass.forName

于 2013-11-06T10:36:38.010 に答える
4
public Class<Job> getClass(String className) {
    String packages[] = { "package.one.", "package.two." };
    for (int j = 0; j < packages.length; j++) {
        try {
            return (Class<Job>) Class.forName(packages[j] + className);
        } catch (ClassNotFoundException ex) {
            System.out.println("Package "+packages[j]+" is not worked");
        }
    }
    return null;
}
于 2013-11-06T10:39:53.817 に答える
1

この場合、 の使用について心配する必要はありませんClassNotFoundException。一般に、フロー制御に例外を使用しない場合もありますが、ここではそのようには数えません。

私はおそらくそれを関数でラップするでしょう

public static String getPackageForClass(String className, String... packageNames) {
    for (String packageName : packageNames) {
        try {
            Class.forName(packageName + className);
            return packageName;
        } catch (ClassNotFoundException ignored) {
        }
    }
    return "";
}

または、必要に応じてクラスを直接返します

public static Class getPackageForClass(String className, String... packageNames) {
    for (String packageName : packageNames) {
        try {
            return Class.forName(packageName + className);
        } catch (ClassNotFoundException ignored) {
        }
    }
    return null;
}
于 2013-11-06T10:49:38.030 に答える