zoukankan      html  css  js  c++  java
  • Class.forName和ClassLoader的区别

    看名字就知道了,一个是类的创建,一个类加载器

    再看下Class.forName源码,调用了ClassLoader

        @CallerSensitive
        public static Class<?> forName(String className)
                    throws ClassNotFoundException {
            Class<?> caller = Reflection.getCallerClass();
            return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
        }

    那么他们的关系就是简单的包含关系了

    写个测试方法测试一下

    public class SimpleClass {
    
        //静态代码块
        static {
            System.out.println("执行了静态代码块");
        }
    
        //静态变量
        private static String staticFiled = staticMethod();
    
        //赋值静态变量的静态方法
        public static String staticMethod() {
            System.out.println("执行了静态方法");
            return "给静态字段赋值了";
        }
    
        public static void main(String[] args) throws ClassNotFoundException {
            Class.forName("com.lgp.SimpleClass");
            System.out.println("#########分割符##########");
            ClassLoader.getSystemClassLoader().loadClass("com.lgp.SimpleClass");
        }
    }

    预期结果

    执行了静态代码块
    执行了静态方法
    #########分割符##########

    所以Class.forName和ClassLoader的区别是

    Class.forName加载并初始化了一个类
    
    ClassLoader仅加载了类
  • 相关阅读:
    排序算法(一)冒泡法
    java是传值还是传引用
    赫夫曼树与赫夫曼编码
    数据结构的相关概念
    字符集和字符编码的区别
    redis为什么选择单线程工作模型
    GET和POST请求的核心区别
    MySQL数据类型及后面小括号的意义
    java中的数据类型
    Jedis无法连接centOS7上的redis
  • 原文地址:https://www.cnblogs.com/ydymz/p/10484347.html
Copyright © 2011-2022 走看看