2014-10-12 45 views
0

我有一个课程扩展了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被加载为依赖项时,可以使类加载。想知道春豆初始化会有所帮助。

+2

您只需要在某处引用该类。 – 2014-10-12 14:01:51

回答

1

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

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

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

+0

我同意可以使用Class.forName(..)。但我不知道这个项目的每个用户都会被告知。我决定公开一个静态方法CustomUnits.valueOf(),它将使用Unit.valueOf()。确保Custom类已加载并初始化。 – Retalemine 2014-12-13 06:20:41

-1

你有没有尝试指定jar(与SystemOfUnits类)作为依赖包含自定义类的通用jar?
您可以在jar的Manifest文件中添加这些依赖项。

相关问题