静态属性理解
静态方法是调用的时候执行的,静态语句块和静态变量是类装载的时候执行的,类是在第一次用到时被装载
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