• Class.forName()的作用


    大家都用过Class.forName(),也都知道是类加载的作用,其实这方法不只是类加载,还有类初始化。

    下面用个小例子说明一下:

    A类,是用来加载的类

    /**
     * 用来测试类加载的类此类有
     * 静态代码块,静态参数
     * 代码块,参数
     * 构造器
    */
    public class A {
        static int i = 1;
        static{
            System.out.println("静态代码块初始化");
        }
        int x = 0;
        {
            System.out.println("代码块初始化");
        }
        public A() {
            System.out.println("构造方法初始化");
        }
    
    }

    TestClass类,用来测试的加载类的测试类:

    /**
     * 此方法用来测试Class.forName()的功能
     */
    public class TestClass {
        
        /**
         * Class.forName()方法会做两件事
         *     1.会把指定的类加载到内存
         *     2.然后把指定的类初始化(类初始化只初始化静态参数和代码块,因为静态是和类同生的)
         * @throws ClassNotFoundException
         */
        @Test
        public void test() throws ClassNotFoundException{
            Class clazz = Class.forName("A");
        }
        
        /**
         * Class.forName(String clazz,boolean bl,ClassLoader cl)
         * 第一个参数就是要加载类的类路径
         * 第二个参数可以指定类加载时是否初始化类
         * 第三个参数可以指定加载类的类加载器
         * @throws ClassNotFoundException
         */
        @Test
        public void test2() throws ClassNotFoundException{
            ClassLoader cl = Class.forName("TestClass").getClassLoader();
            Class.forName("A", false, cl);
        }
    }

    结果:

    1.test()输出结果是

    静态代码块初始化

    说明,Class.forName()不仅加载了类,还初始化了类参数(静态)。

    2.test2()输出结果是

     (空)

    说明,Class.forName(String,boolean,ClassLoader)可以指定加载类的类路径、是否初始化类参数、加载类的类加载器。当第二个参数为false时,只加载类,不初始化类。

    其实,分析一下Class.forName()的源码会发现,forName(String)方法和forName(String,true,currentClassloader)的作用是一样的!

  • 相关阅读:
    深入浅出进程与线程的基本概念
    python中with的用法
    浮点型数据在内存中存储的表示
    自问问题列表以及网络答案整理
    看java源代码
    【设计模式】工厂方法
    SQL实现递归及存储过程中 In() 参数传递解决方案
    app与server联系
    添加service到SystemService硬件服务
    noproguard.classes-with-local.dex
  • 原文地址:https://www.cnblogs.com/WreckBear/p/4917432.html
Copyright © 2020-2023  润新知