1

我有一个扩展 Jscience 的 SystemOfUnits 的类来定义一些自定义单位。我希望这个类甚至在调用任何对方法 Unit.valueOf() 的调用之前就由 JVM 加载。

如果该类未在 JVM 中加载,则下面的调用失败为java.text.ParseException: dz not Recognized (in dz at index 0)

 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 的一部分,该 jar 将作为对其他主要应用程序的依赖项可用,并且我不希望每个用户都被告知应在调用 Unit.valueOf() 之前在某处引用此类。

当包含自定义类的 jar 作为依赖项加载时,寻找可以加载类的可能选项。

想知道spring bean初始化会有所帮助。

4

2 回答 2

2

通常,没有选项可以告诉 JVM 何时加载类。只有当其他一些类引用它时才会加载类。

CustomUnits此外,您不仅需要加载AFAIU,还需要对其进行初始化(运行静态构造函数)。初始化可以通过使用类的静态成员以及实例创建来触发。

作为一种解决方法,您可以调用Class.forName(...)方法 - 它还保证类被完全加载和初始化。

于 2014-10-25T19:19:18.510 回答
-1

您是否尝试将 jar(带有 SystemOfUnits 类)指定为包含自定义类的公共 jar 的依赖项?
您可以在 jar 的清单文件中添加这些依赖项。

于 2014-10-13T17:20:44.513 回答