首先使用main方法加载类,然后手动加载其他类

时间:2013-08-24 13:38:14

标签: java

我正在阅读Cay Horstmann撰写的Core Java。 这里有一段我​​无法理解的摘录:

  

启动时,会加载包含mainmethod的类。它加载   它需要的所有类。每个加载的类加载   它需要的类,等等。这可能需要很长时间才能实现   应用程序,令用户感到沮丧。您可以为您的程序用户提供更快的幻觉   从以下技巧开始。确保包含main方法的类没有   明确地引用其他类。首先显示启动画面。然后手动强制加载   通过调用Class.forName来调用其他类。

你能给我一个代码的小例子,以便我能理解吗?

3 个答案:

答案 0 :(得分: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通常已启用lazy class resolution,因此您可能看不到很大差异。在急切的类解析的情况下,SlowSplasher中的启动只会在加载TheActualApplication中使用的所有类之后显示。在FastSplasher中,启动画面会立即显示,因为类TheActualApplication在运行时使用反射动态加载,无法静态解析,因此在启动时加载。

答案 1 :(得分:1)

我不知道该陈述是否仍然有效且有用。根据{{​​3}},可以在Java 6启动JVM之前显示启动屏幕,因此可能不需要其他答案中显示的技巧。

答案 2 :(得分: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");
  }
}