美文网首页转载
Java Class.forName() 与 ClassLoad

Java Class.forName() 与 ClassLoad

作者: 专职跑龙套 | 来源:发表于2017-01-06 17:57 被阅读191次

类的显示加载 VS 类的隐式加载

  • 显示加载:
    • 通过 Class c = Class.forName("Student");
    • 通过 ClassLoader 的 loadClass() 方法,例如:
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class c = cl.loadClass("Student");
  • 隐式加载:通过 new,例如 Student s = new Student("")

Class.forName() VS ClassLoader.loadClass()

关于 Class.forName(),其代码如下:

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

其中 forName0() 方法调用中的参数 true 表示要初始化该类。包括:

  • 执行静态代码块
  • 初始化静态域

关于类的初始化,具体参见 Java 类的加载,链接,初始化

关于 ClassLoader.loadClass(),其代码如下:

    public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
    }

其中 loadClass() 方法调用中的参数 false 表示这个类加载后不需要去链接。

总结

  • Class.forName() 得到的 Class 是已经完成初始化的
  • ClassLoader.loadClass() 得到的 Class 是还没有链接的
  • 一般情况下,这两个方法效果一样,都能装载Class
  • 如果程序依赖于 Class 是否被初始化,就必须用 Class.forName(),例如加载 JDBC 的驱动:
    Class.forName("com.mysql.jdbc.Driver");

相关文章

  • Java Class.forName() 与 ClassLoad

    类的显示加载 VS 类的隐式加载 显示加载:通过 Class c = Class.forName("Student...

  • JVM类加载机制

    原文链接:https://www.pdai.tech/md/java/jvm/java-jvm-classload...

  • 反射中,Class-forName-和-ClassLoader的

    java中class.forName()和classLoader都可用来对类进行加载。class.forName(...

  • 类加载

    Java中class.forName()和classLoader都可用来对类进行加载。class.forName(...

  • java反射

    java编译与运行 编译:静态加载 如 new创建对象运行:动态加载 如 Class.forName()(得到...

  • 某Java项目一期完成后的小结

    项目小结 技术栈: Spring Boot、Java Agent、 Byte Buddy、自定义ClassLoad...

  • 热修复-原理与实现

    Android中的类加载器 Android跟Java有很大的渊源,基于JVM的java应用是通过ClassLoad...

  • Android热修复【原理】

    Android中的类加载器 Android跟java有很大的渊源,基于jvm的java应用是通过ClassLoad...

  • java ClassLoad加载机制

    写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做...

  • Java 反射

    Java 反射 类方法 类别说明ClassClass.forName(String className)通过...

网友评论

    本文标题:Java Class.forName() 与 ClassLoad

    本文链接:https://www.haomeiwen.com/subject/svlxbttx.html