2014-10-12 79 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文件中添加這些依賴項。

相關問題