靜態語句塊是初始化時執行

靜態屬性理解

靜態方法是調用的時候執行的,靜態語句塊和靜態變量是類裝載的時候執行的,類是在第一次用到時被裝載

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章