zoukankan      html  css  js  c++  java
  • java中class.forName和classLoader加载类的区分

       java中class.forName和classLoader都可用来对类进行加载。前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块(网上有很多文章说,static块在类第一次被加载是执行,是错误的,比如这个人的博客:https://yq.aliyun.com/articles/58333)。

    我们可以通过一个小例子来验证一下:

    class MyClass1 {
        static {//静态块
            System.out.println("static block ");
        }
    }
    public class Main {
    
        Class[] classArray = {
                MyClass1.class//这样引用该类,必然需要将该类加载到虚拟机中
        };
        public static void main(String[] args){
            System.out.println("hello word");
        }
    
    }

    执行结果:并没有输出" static bolck"

    Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象 。比如:

    Static Class forName(String name, boolean initialize, ClassLoader loader)

    initialize 设定为 false,这样在加载类时并不会立即运行静态区块,而会在使用类建立对象时才运行静态区块。

    其实当你调用Class.forName("classname")的时候相当于:

    Class.forName("classname",true,this.getClass().getClassLoader());

      什么情况下使用class.forname?

      在一些应用中,无法事先知道使用者将加载什么类,而必须让使用者指定类名称以加载类,可以使用 Class 的静态 forName() 方法实现动态加载类。下面的范例让你可以指定类名称来获得类的相关信息。例如我们最熟悉的数据库驱动就是通过显示的class.forname来夹在数据库驱动类的,因为jvm启动的时候根本不知道你需要加在mysql的驱动包还是sqlserver的数据库驱动包。

    /* 连接mysql 时装载的驱动类以及连接字符串 */
    Class.forName(“com.mysql.jdbc.Driver”);//1
    DriverManager.getConnection(“jdbc:mysql://localhost:3306/test”,”root”,”123”);//2
    /* 连接SQLServer2005 时装载的驱动类以及连接字符串 */
    Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
    DriverManager.getConnection(“jdbc:sqlserver://localhost:1433;databaseName=pubs”,”sa”, ””);
    

     引用:http://blog.csdn.net/u011202334/article/details/51497998

        http://blog.csdn.net/berber78/article/details/46472789

  • 相关阅读:
    好一张图(饼得慢慢吃)
    kafka消息存储原理及查询机制
    (四)SpringCloud入门篇——工程重构
    (三)SpringCloud入门篇——微服务消费者订单Module模块
    java.sql.SQLException: org.gjt.mm.mysql.Driver
    (二)SpringCloud入门篇——Rest微服务工程:支付模块构建
    (一)SpringCloud入门篇——微服务cloud整体聚合:父工程步骤
    虚拟机中docker安装mysql远程无法访问
    Java初级开发项目
    类和对象
  • 原文地址:https://www.cnblogs.com/guazi/p/6491378.html
Copyright © 2011-2022 走看看