如何确保在应用程序启动时加载java类?
我有一个课程扩展了Jscience的SystemOfUnits来定义一些自定义单位。即使在调用方法Unit.valueOf()之前,我也希望此类可以由JVM加载。如何确保在应用程序启动时加载java类?
如果该类没有在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被加载为依赖项时,可以使类加载。想知道春豆初始化会有所帮助。
通常,没有选项可以告诉JVM何时加载类。只有当其他类引用它时才会加载类。
此外,AFAIU需要CustomUnits
而不是仅仅成为加载但要初始化(运行静态构造函数)。初始化可以通过使用类的静态成员以及实例创建来触发。
作为一种解决方法,您可以调用Class.forName(...)
方法 - 它也保证类将被完全加载和初始化。
我同意可以使用Class.forName(..)。但我不知道这个项目的每个用户都会被告知。我决定公开一个静态方法CustomUnits.valueOf(),它将使用Unit.valueOf()。确保Custom类已加载并初始化。 – Retalemine 2014-12-13 06:20:41
你有没有尝试指定jar(与SystemOfUnits类)作为依赖包含自定义类的通用jar?
您可以在jar的Manifest文件中添加这些依赖项。
您只需要在某处引用该类。 – 2014-10-12 14:01:51