Android - 静态块没有被首先调用,为什么?
Android - Static Block not being called first, why?
根据我的 Java 理解,静态块应该在任何其他函数之前执行。
我有一个调用静态函数的静态块,都在 class MyClass.java 中,它使用 SharedPreferences 对象。
MyClass 由 MyApplication(扩展应用程序)使用,位于 onCreateMethod 的某处。
static {
doSomethingStaticFirst();
}
private static void doSomethingStaticFirst() {
//Log(DO_SOMETHING_STATIC_FIRST)
UserPreferences userPreferences = new UserPreferences(MyApplication.getInstance().getApplicationContext());
}
但是我看到了以下日志的顺序:
- MyApplication onCreate 方法
- DatabaseManager onUpdate(以防数据库版本增加)
- DO_SOMETHING_STATIC_FIRST
没有先执行静态块有什么特别的原因吗? MyApplication onCreate
方法会优先执行吗?
您的假设不准确。
class 中的静态块在您的 class 被 加载时执行 - 这是第一次在代码中引用它。
如果您确实需要让静态块更早执行,您可以强制加载 class - 执行路径中较早的 Class.forName("com.foo.MyClassWithStaticFunctions")
之类的内容将强制静态块更早执行。
根据我的 Java 理解,静态块应该在任何其他函数之前执行。
我有一个调用静态函数的静态块,都在 class MyClass.java 中,它使用 SharedPreferences 对象。
MyClass 由 MyApplication(扩展应用程序)使用,位于 onCreateMethod 的某处。
static {
doSomethingStaticFirst();
}
private static void doSomethingStaticFirst() {
//Log(DO_SOMETHING_STATIC_FIRST)
UserPreferences userPreferences = new UserPreferences(MyApplication.getInstance().getApplicationContext());
}
但是我看到了以下日志的顺序:
- MyApplication onCreate 方法
- DatabaseManager onUpdate(以防数据库版本增加)
- DO_SOMETHING_STATIC_FIRST
没有先执行静态块有什么特别的原因吗? MyApplication onCreate
方法会优先执行吗?
您的假设不准确。
class 中的静态块在您的 class 被 加载时执行 - 这是第一次在代码中引用它。
如果您确实需要让静态块更早执行,您可以强制加载 class - 执行路径中较早的 Class.forName("com.foo.MyClassWithStaticFunctions")
之类的内容将强制静态块更早执行。