• 类加载机制 + Classloader.loadClass(String name)和Class.forName(String name)


    Classloader.loadClass(String name)和Class.forName(String name)的区别

    Java的类在jvm中的加载大致分为加载,链接或者叫link(里面包含初始化),然后这个Classloader.loadClass方法,得到的Class甚至还没走到link链接这一步,更别说初始化,也就是说调用这个可以得到一个Class Object,但不会初始化这个类中的static field还有static块。

    而Class.forName方法呢,是会进行初始化操作的,所以调用这个不仅能拿到Class Object还能让该类的static field和static块初始化。

    更多分析参考:https://www.cnblogs.com/suibianle/p/6676215.html——《ClassLoader.loadClass和Class.forName的区别》

    JVM 类加载机制详解

    内容直接参见:http://www.importnew.com/25295.html——《JVM 类加载机制详解》

    这里提一下类加载的双亲委派模型的优点和好处吧:

    1. 保证了运行的安全性,防止不可信类扮演可信任的类。
    2. Java类伴随其类加载器具备了带有优先级的层次关系,确保了在各种加载环境的加载顺序。

    第二点用一句话来讲就是,防止内存中出现多份同样的字节码。

    从反向思考这个问题,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,多个类加载器都去加载这个类到内存中,系统中将会出现多个不同的Object类,那么类之间的比较结果及类的唯一性将无法保证,而且如果不使用这种双亲委派模型将会给虚拟机的安全带来隐患。所以,要让类对象进行比较有意义,前提是他们要被同一个类加载器加载。

  • 相关阅读:
    ABP 菜单 修改
    C# 过滤器
    RabbitMQ框架构建系列(三)——Net实现RabbitMQ之Producer
    RabbitMQ系列(二)RabbitMQ基础介绍
    RabbitMQ系列(一)AMPQ协议
    MVC 解读WebConfig
    MVC过滤器特性
    asp.net中使用JQueryEasyUI
    asp.net请求到响应的整个过程
    Redis的下载安装部署(Windows)
  • 原文地址:https://www.cnblogs.com/wangshen31/p/10497065.html
Copyright © 2020-2023  润新知