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

    public class ClassLoaderOrClassForName{
    
        public static void main(String[] args) throws ClassNotFoundException{
            ClassLoader loader = ClassLoader.getSystemClassLoader();
            Class<?> loadClass = loader.loadClass("TestDiff");
            System.out.println("Load Class : " + loadClass.getName());
    System.out.println("------"); Class
    <?> forName = Class.forName("TestDiff"); System.out.println("Class for Name : " + forName.getName()); } } class TestDiff{ static { System.out.println("Static Method"); } }

    output:

    Load Class : TestDiff
    ------
    Static Method
    Class for Name : TestDiff

      Class.forName方法将类的.class文件加载到jvm的同时会执行static方法块中的内容。

      classLoader只会将类的.class文件加载到jvm中,不会执行static中的内容,只有在调用newInstance()方法调用构造函数,创建类的对象。

      

      JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化。

      加载阶段会在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的入口

      验证阶段主要是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害jvm自身的安全

      准备阶段是正式为类变量分配内存并设计类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间

      解析阶段是指虚拟机将常量池中的符号饮用替换为直接应用的过程,符号引用就是class文件中的CONSTANT_Class_info,CONSTANT_Field_info,CONSTANT_Method_info

      初始化阶段是类加载最后一个阶段。初始化阶段是执行类构造器<client>方法的过程。<client>方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成。虚拟机会保证<client>方法执行前,父类的<client>方法已经执行完毕。

      JVM提供了3种类加载器

        Bootstrap ClassLoader:负责加载JAVA_HOMElib目录中的,或通过Xbootclasspath参数指定路径中的,且被虚拟机认可的类

        Extension ClassLoader:负责加载JAVA_HOMElibext目录中的,或通过java.ext.dirs系统变量指定路径中的类库

        Application ClassLoader:负责加载用户路径上的类库

  • 相关阅读:
    等待队列设备[置顶] Linux设备驱动,等待队列
    宠物功能[置顶] QQ宠物保姆
    选中拖动Unity3D系列教程–使用免费工具在Unity3D中开发2D游戏 第二节(下)
    序列化对象java中为什么要实现序列化,什么时候实现序列化?
    函数表达式[置顶] 母函数详解
    文件问题cocos2dx&cocosbuilder折腾记
    模块functionJavaScript学习笔记(二十五) 沙箱模式
    nullnullflume ng配置拓扑图
    对象序列化对象的序列化和反序列化
    扩展编程PHP自学之路PHP数据库编程
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/9242053.html
Copyright © 2011-2022 走看看