靜態屬性理解
靜態方法是調用的時候執行的,靜態語句塊和靜態變量是類裝載的時候執行的,類是在第一次用到時被裝載
1. 測試demo
1.1 運行類
package com.example.myapplication;
public class LocationManagerService {
public static void main(String[] args) {
if(GnssLocationProvider.native_is_supported()){
// 類是在第一次用到時被裝載
GnssLocationProvider mGnss = new GnssLocationProvider();
}
}
}
1.2 測試類
package com.example.myapplication;
public class GnssLocationProvider {
// 靜態變量是類裝載的時候執行的
//
public static int num = getNum();
// 靜態語句塊是類裝載的時候執行的
// 靜態語句塊和靜態變量是平級的,先定義先執行
static {
class_init_native();
}
// 靜態方法是調用的時候執行的
public static void native_init() {
System.out.println("native_init");
}
// 靜態方法是調用的時候執行的
public static void class_init_native() {
System.out.println("class_init_native");
}
public static boolean native_is_supported() {
System.out.println("native_is_supported");
return true;
}
// 靜態方法是調用的時候執行的
public static int getNum(){
System.out.println("return num ");
return 0;
}
}
2. 運行結果
3. 使用Java 反射進一步研究下
package com.example.myapplication;
import java.lang.reflect.Method;
public class LocationManagerService {
public static void main(String[] args) {
/* if(GnssLocationProvider.native_is_supported()){
// 類是在第一次用到時被裝載
GnssLocationProvider mGnss = new GnssLocationProvider();
}*/
Class mClass = null;
try {
System.out.println("forName_pre");
mClass = Class.forName("com.example.myapplication.GnssLocationProvider");
System.out.println("forName_after");
System.out.println("getMethod_pre");
Method method1 = mClass.getMethod("native_is_supported");
System.out.println("getMethod_after");
System.out.println("invoke_pre");
method1.invoke(mClass);
System.out.println("invoke_after");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4. Java 反射調用運行結果
說明在 Java forName 時間段執行了靜態語句塊
forName_pre
return num
class_init_native
forName_after
getMethod_pre
getMethod_after
invoke_pre
native_is_supported
invoke_after
Process finished with exit code 0