我有一个扩展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初始化会有所帮助。
答案 0 :(得分:2)
通常,没有选项可以告诉JVM何时加载类。只有当其他类引用它时才会加载类。
此外,AFAIU您需要CustomUnits
不仅要加载而且要初始化(运行静态构造函数)。可以通过使用类的静态成员以及实例创建来触发初始化。
作为一种解决方法,您可以调用Class.forName(...)
方法 - 它还可以保证类完全加载和初始化。
答案 1 :(得分:-1)
您是否尝试将jar(使用SystemOfUnits类)指定为包含自定义类的公共jar的依赖项?
您可以在jar的Manifest文件中添加这些依赖项。