1

Jscience の SystemOfUnits を拡張していくつかのカスタム ユニットを定義するクラスがあります。メソッド Unit.valueOf() への呼び出しが呼び出される前であっても、このクラスを JVM によってロードする必要があります。

クラスが JVM にロードされていない場合、以下の呼び出しはjava.text.ParseException: dz が認識されない (インデックス 0 の dz 内)として失敗します。

 Unit.valueOf("dz");

-

 public final class CustomUnits extends SystemOfUnits {

 ...

 private static HashSet<Unit<?>> UNITS = new HashSet<Unit<?>>();

 public static final Unit<Dimensionless> DOZEN = customUnits(Unit.ONE
        .times(12));

 public static final Unit<Dimensionless> PIECE = customUnits(DOZEN
        .divide(12));

 static {
    UnitFormat.getInstance().label(CustomUnits.DOZEN, "dz");
    UnitFormat.getInstance().label(CustomUnits.PIECE, "pcs");
 }

 @Override
 public Set<Unit<?>> getUnits() {
    return Collections.unmodifiableSet(UNITS);
 }

 ....
 }

また、このクラスは、他のメイン アプリケーションへの依存関係として利用できる共通の jar の一部になることも通知されます。Unit.valueOf() が呼び出される前に、このクラスをどこかで参照する必要があることをすべてのユーザーに通知したくありません。

カスタム クラスを含む jar が依存関係として読み込まれるときに、クラスを読み込むことができるオプションを探しています。

Spring Bean の初期化が役立つかどうか疑問に思います。

4

2 に答える 2

2

通常、クラスをロードするタイミングを JVM に指示するオプションはありません。クラスは、他のクラスが参照する場合にのみロードされます。

さらに、AFAIUは、ロードCustomUnitsするだけでなく、初期化する必要があります(静的コンストラクターを実行するため)。初期化は、インスタンスの作成だけでなく、クラスの静的メンバーを使用してトリガーできます。

回避策として、メソッドを呼び出すことができます。これにより、Class.forName(...)クラスが完全にロードされて初期化されることも保証されます。

于 2014-10-25T19:19:18.510 に答える
-1

カスタム クラスを含む共通の jar への依存関係として (SystemOfUnits クラスを使用して) jar を指定しようとしましたか?
これらの依存関係は、jar のマニフェスト ファイルに追加できます。

于 2014-10-13T17:20:44.513 に答える