静态语句块是初始化时执行

静态属性理解

静态方法是调用的时候执行的,静态语句块和静态变量是类装载的时候执行的,类是在第一次用到时被装载

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值