如何确保在应用程序启动时加载java类?

时间:2014-10-12 13:51:41

标签: java jvm jscience

我有一个扩展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初始化会有所帮助。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:-1)

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