关于虚拟机加载类的先后顺序测试

有关虚拟机的学习已在近期计划中,书籍已买,但尚未进行.今天准备研读spring的事务相关源码,随即复习了一下相关知识.看到一位前辈在github上的代码,非常有意思,特记下笔记,以供学习和后期复习:

public class DataSourceFactory
{

    private static final BasicDataSource dataSource = new BasicDataSource();

    static
    {
        dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
        dataSource.setUsername("SA");
        dataSource.setPassword("");
        dataSource.setUrl("jdbc:hsqldb:mem:bank");
    }

    public static DataSource createDataSource()
    {
        return dataSource;
    }
}

 

 

以上为相关代码,写法可以优化,比如讲数据库连接参数写到配置文件里.

但我想记录的是:
这里利用了虚拟机加载类的先后顺序和特性:虚拟机加载类的时候,@1.先加载该类的静态常量和变量(静态常量和变量按顺序加载),@2.然后加载静态代码块,@3.最后再加载其它部分。

而且,静态常量和静态代码块只在加载类的时候执行一次,new 新的对象的时候不再执行.

 

因此,此处代码 在加载的时候,直接将参数一起加载了,其它类 直接调用该类的 createDataSource()方法,即可获取数据库连接对象;

 

以下是我写的一个简单的demo,来印证以上描述:

public class StaticTest {
    public static final a  btest= new a("btest");
    public static a  atest= new a("atest");


    static {
        System.out.println("I AM STATICS'S CODE");
    }
    public static void main(String [] args){
        StaticTest staticTest =new StaticTest();
        staticTest.test();
        StaticTest staticTest1 = new StaticTest();
        staticTest1.test();
    }

    public void test (){
        System.out.println("I AM NOT STATICS'S CODE");
    }


    static class a{
        a(String a){
            System.out.println(a);
        }
    }


}

 

 

以上为demo代码,

以下为执行输出内容:

btest
atest
I AM STATICS'S CODE
I AM NOT STATICS'S CODE
I AM NOT STATICS'S CODE

,无论新建该类的多少个对象,该类的 静态变量和静态常量还有静态代码块只执行一次.

 

不得不感叹的是:灵活运用是王道!

至于更底层的内容下一阶段学习虚拟机相关知识将会涉及,此处先略过.

 

posted @ 2017-05-24 00:26  it馅儿包子  阅读(813)  评论(0编辑  收藏  举报