4

Cay Horstmann の Core Java を読んでいます。ここに私が理解できない抜粋があります:

起動時に、mainmethod を含むクラスがロードされます。必要なすべてのクラスをロードします。ロードされた各クラスは、必要なクラスをロードします。大きなアプリケーションの場合、これには長い時間がかかり、ユーザーをイライラさせます。次のトリックを使用して、プログラムのユーザーに起動が高速であるという錯覚を与えることができます。main メソッドを含むクラスが他のクラスを明示的に参照していないことを確認してください。最初にスプラッシュ画面を表示します。次に、Class.forName を呼び出して、手動で他のクラスの読み込みを強制します。

私が理解できるように、コードの小さな例を教えていただけますか?

4

3 に答える 3

2

引用で言及されているトリックは、基本的に、プログラムを呼び出した直後にスプラッシュ スクリーンを表示し、クラスのロードを開始することによって、アプリケーションのロードが高速であるという錯覚をユーザーに与える方法です。

アプリケーションのメイン クラスがTheActualApplication. そのため、アプリケーションのスタートアップ クラスを作成すると、メイン クラスとして使用するFastSplash場合よりも早くスプラッシュ スクリーンが表示される場合があります。SlowSplash

public class FastSplasher {
    public static void main(String[] args) {
         SplashWindow.splash(Splasher.class.getResource("splash.gif"));
         SplashWindow.invokeMain("TheActualApplication", args);
         SplashWindow.disposeSplash();
     }
 }

public class SlowSplasher {
    public static void main(String[] args) {
         SplashWindow.splash(Splasher.class.getResource("splash.gif"));
         TheActualApplication.main(args);
         SplashWindow.disposeSplash();
     }
 }

使用時にスプラッシュ スクリーンがすぐに表示される理由FastSplashは、現在の Java VM では通常、遅延クラス解決がオンになっているため、大きな違いが見られない可能性があるためです。積極的なクラス解決の場合、スプラッシュ インSlowSplasherは、で使用されるすべてのクラスがロードされた後にのみ表示さTheActualApplicationれます。クラスは実行時にリフレクションを使用して動的にロードされ、静的に解決できず、起動時にロードされるFastSplasherため、スプラッシュ画面にすぐに表示されます。TheActualApplication

于 2013-08-24T15:11:42.607 に答える
1

その声明がまだ有効で有用かどうかはわかりません。チュートリアルによると、Java 6 から JVM の起動前にスプラッシュ画面を表示できるため、他の回答で示されているトリックは必要ないかもしれません。

于 2013-08-24T14:57:06.757 に答える
0

MyClassMyClass2アプリケーションの起動後に読み込まれます

class MyClass {
  static {  System.out.println("MyClass loaded"); }
  private MyClass2 ref;
}

class Main {
  public static void main(String... args) {
     System.out.println("Starting application...");
     Class.forName("MyClass");
  }
}
于 2013-08-24T14:50:19.853 に答える