我正在阅读 Cay Horstmann 的 Core Java。这里有一段我看不懂的摘录:
在启动时,会加载包含您的 mainmethod 的类。它加载它需要的所有类。每个加载的类都加载它需要的类,依此类推。对于大型应用程序来说,这可能需要很长时间,让用户感到沮丧。您可以通过以下技巧让程序的用户产生更快启动的错觉。确保包含 main 方法的类没有显式引用其他类。首先显示一个启动画面。然后通过调用 Class.forName 手动强制加载其他类。
你能给我一个代码的小例子以便我理解吗?
我正在阅读 Cay Horstmann 的 Core Java。这里有一段我看不懂的摘录:
在启动时,会加载包含您的 mainmethod 的类。它加载它需要的所有类。每个加载的类都加载它需要的类,依此类推。对于大型应用程序来说,这可能需要很长时间,让用户感到沮丧。您可以通过以下技巧让程序的用户产生更快启动的错觉。确保包含 main 方法的类没有显式引用其他类。首先显示一个启动画面。然后通过调用 Class.forName 手动强制加载其他类。
你能给我一个代码的小例子以便我理解吗?
引用中提到的技巧基本上是一种通过在调用程序后“立即”显示启动屏幕然后才开始加载类来给用户一种应用程序加载速度更快的错觉。
假设您的应用程序的主类是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
是在运行时使用反射动态加载的,并且无法静态解析,因此在启动时加载。
我不知道该声明是否仍然有效和有用。根据教程,可以在从 Java 6 启动 JVM 之前显示启动画面,因此可能不需要其他答案中显示的技巧。
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");
}
}