我正在阅读Cay Horstmann撰写的Core Java。 这里有一段我无法理解的摘录:
启动时,会加载包含mainmethod的类。它加载 它需要的所有类。每个加载的类加载 它需要的类,等等。这可能需要很长时间才能实现 应用程序,令用户感到沮丧。您可以为您的程序用户提供更快的幻觉 从以下技巧开始。确保包含main方法的类没有 明确地引用其他类。首先显示启动画面。然后手动强制加载 通过调用Class.forName来调用其他类。
你能给我一个代码的小例子,以便我能理解吗?
答案 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)
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");
}
}