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


    有关虚拟机的学习已在近期计划中,书籍已买,但尚未进行.今天准备研读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

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

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

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

  • 相关阅读:
    springBoot异常处理
    webSocket
    Java正则
    String.format
    JSTL-taglib
    http meta
    chrome 常用插件下载安装
    mysql 命令行个性化设置
    Entity Framework Code First
    SignalR Connection has not been fully initialized
  • 原文地址:https://www.cnblogs.com/zqsky/p/6896909.html
Copyright © 2020-2023  润新知