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

Java 首先用main方法加载类,然后手动加载其他类,java,Java,我正在读Cay Horstmann的Core Java。 这里有一段我无法理解的摘录: 启动时,将加载包含main方法的类。它装载 它需要的所有类。每个加载的类都加载 它需要的类,等等。这可能需要很长时间才能完成一个大的任务 应用程序,让用户感到沮丧。你可以给你的程序的用户一种更快的错觉 从以下技巧开始。确保包含main方法的类不存在 显式引用其他类。首先显示一个启动屏幕。然后手动强制加载 通过调用Class.forName来创建其他类的 你能给我一个小的代码示例,以便我能理解它吗?MyClas

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

启动时,将加载包含main方法的类。它装载 它需要的所有类。每个加载的类都加载 它需要的类,等等。这可能需要很长时间才能完成一个大的任务 应用程序,让用户感到沮丧。你可以给你的程序的用户一种更快的错觉 从以下技巧开始。确保包含main方法的类不存在 显式引用其他类。首先显示一个启动屏幕。然后手动强制加载 通过调用Class.forName来创建其他类的


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

MyClass
MyClass2
将在应用程序启动后加载

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");
  }
}

我不知道那句话是否仍然有效和有用。根据,启动屏幕可以在Java 6启动JVM之前显示,因此其他答案中显示的技巧可能没有必要。

引用中提到的技巧基本上是一种让用户产生错觉的方法,即通过“立即”显示启动屏幕,应用程序加载得更快调用程序后,然后才开始加载类

假设应用程序的主类是实际应用程序。 因此,如果将
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虚拟机通常已经打开,因此您可能看不到有什么大的不同。在急切类解析的情况下,
SlowSplasher
中的splash仅在加载了
实际应用程序中使用的所有类后才会显示。在
FastSplasher
中,启动屏幕立即出现,因为类
实际应用程序
在运行时使用反射动态加载,无法静态解析,因此在启动时加载。

这是一个极好的点!但是要利用这个特性,您需要在commant行给出splash图像:
java-splash:
这本书是为JavaSE6修订和更新的。因此,从这一点来看,这个提示一定是有用的。但我不知道如何使用它。你能澄清一下你说“你可能看不到大的不同”时的意思吗?您的意思是,从应用程序启动到用户可以开始使用它的总时间是相同的?您的意思是,FastSplasher中的启动屏幕几乎会立即出现,而SlowSplasher中的启动屏幕只会在几乎不必要时出现?在这种情况下,卡托纳下面的评论非常有用。正如在Java6中一样,您可以在一开始就加载一个启动屏幕。是的,这个技巧不会加快应用程序变得有用所需的时间。但另一方面,惰性类解析实际上加快了时间,因为从整个程序引用的所有类不太可能在显示给用户的第一个屏幕中使用。从启动画面的角度来看,卡托纳有一个很好的观点。你应该尝试这两种方法,看看什么最适合你。