簡體   English   中英

如何確保在應用程序啟動時加載Java類?

[英]How to ensure that a java class is loaded at application startup itself?

我有一個擴展Jscience的SystemOfUnits的類,以定義一些自定義單位。 我希望在對方法Unit.valueOf()的任何調用被調用之前,由JVM加載此類。

如果未在JVM中加載該類,則以下調用失敗,因為java.text.ParseException:無法識別dz(在dz的索引0處)

 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進行加載 ,還需要CustomUnits進行初始化 (以運行靜態構造函數)。 可以通過使用類的靜態成員以及實例創建來觸發初始化。

解決方法是,可以調用Class.forName(...)方法-它也可以保證類已完全加載和初始化。

您是否嘗試過將jar(帶有SystemOfUnits類)指定為對包含定制類的普通jar的依賴關系?
您可以在jar的清單文件中添加這些依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM