首页 > 其他分享 >类加载器(ClassLoader)

类加载器(ClassLoader)

时间:2024-05-08 21:22:58浏览次数:20  
标签:java ClassLoader getClassLoader DefineClassDemo class 加载

类加载器(ClassLoader)

类加载、编译

类加载器用于将Java类(此时的Java类指的是已经从.java编译成.class的字节码文件)通过JVM加载到内存中才能运行。

编译java文件

包名为:package com.melody.sec.classloader;、类名称为:DefineClassDemo

  1. 编译java文件

    javac com/melody/sec/classloader/DefineClassDemo.java

  2. 运行class文件

    java com.melody.sec.classloader.DefineClassDemo

  3. 反编译class文件

    javap -c -l -p com.melody.sec.classloader.DefineClassDemo

  4. 查看字节码具体内容

    hexdump -C com/melody/sec/classloader/DefineClassDemo.class

请注意:

在java程序运行时涉及到类的概念,因此在运行class文件的时候使用的是类修饰限定的形式,而当在编译代码,查看文件内容的具体情况时,使用的是相对路径。「总结:当作文件利用时写文件名,当作类使用时写类名」

类加载器

类加载器有四类(Bootstrap ClassLoader(引导类加载器)Extension ClassLoader(扩展类加载器)App ClassLoader(系统类加载器)),在其他文章中有明确解释,以及父类委派机制的流程,这里不在赘述。

父类委派机制:设计的初衷是为了防止攻击者恶意修改一些标准库中的类文件,因此通过父类委派机制对常规使用的类进行加载,防止其他人的恶意破坏。

「总结:对于某个类名(the binary name of a class),总是先使用父类加载器对其进行加载,若无法加载在使用子类的类加载器」。

类加载器加载类的逻辑

类名 -> 文件名->获取对应的class文件->读取class文件中字节码->将字节码加载到JVM中

理解了类加载器加载类的逻辑后,不妨提出几个问题:

  1. 如何获取类加载器,获取的类加载器是属于哪一种?
  2. 类加载器如何加载指定的类?
  3. 所有的类都有对应的类加载器吗?

下面,对上述问题进行逐一的解决。

获取类加载器

每一个类对象都包含了定义它的类加载器的引用。因此,获取类加载器的思路应该是从类对象中来。

  1. 获取当前类的类加载器

    this.getClass().getClassLoader(); // sun.misc.Launcher$AppClassLoader@18b4aac2
    
  2. 获取其他包中的类的类加载器

    ZipPath.class.getClassLoader(); // sun.misc.Launcher$ExtClassLoader@28d93b30
    
  3. 获取JVM在初始化时就加载的类的类加载器,即Bootstrap ClassLoader加载的类

    File.class.getClassLoader();        // null
    

所有类都有类加载器吗?

知道如何获取类加载器后,可以解决问题三,所有的类都有对应的类加载器吗?

查看官方文档,存在两种「特例」:

  1. 类数组加载时并不会使用类加载器进行加载,而是依赖于Java Runtime,但对数组类获取类加载器时,和对数据中的每个元素的类加载器是一致的。

        public void solveProblem03(){
            // 所有的类都有对应的类加载器吗?
            // Class objects for array classes are not created by class loaders, but are created automatically as required by the Java runtime. The class loader for an array class, as returned by Class.getClassLoader() is the same as the class loader for its element type; 
            DefineClassDemo[] classDemos = new DefineClassDemo[3];
            ClassLoader classLoader = classDemos.getClass().getClassLoader();
            System.out.println(classLoader);    // sun.misc.Launcher$AppClassLoader@18b4aac2
        }
    
  2. 若类的类似是元类型,则没有类加载器

            //  if the element type is a primitive type, then the array class has no class loader.
    		   char[] bytes = "hello".toCharArray();
            System.out.println(bytes.getClass().getClassLoader());  // null
    

类加载器如何加载类

类从哪里加载?

  1. 从文件系统加载类。(如CLASSPATH环境变量定义的类路径加载)
  2. 从远端服务器上加载类。

标签:java,ClassLoader,getClassLoader,DefineClassDemo,class,加载
From: https://www.cnblogs.com/s1gn/p/18180901

相关文章

  • 微信小程序加载更多
    背景:博客小程序开发,涉及博客列表加载更多需求。前提:接口:https://abc.com/api/xx?pageSize=xx&page=xxview代码:<viewclass="container"><viewwx:for="{{items}}"wx:key="id"><text>{{item.cid}}--{{item.title}}</text>......
  • java虚拟机内存结构——类加载器,运行时数据区,执行引擎,本地方法接口。《深入理解JAVA虚
    ##类加载器类加载器当Java程序需要使用某个类时,类加载子系统负责找到对应的.class文件,并将其加载到JVM的方法区中每一个类加载器,都拥有一个独立的类名称空间。只有在这两个类是由同一个类加载器加载的前提下才有意义##运行时数据区###线程共享####堆:内......
  • pytorch训练简单加减验证码(一):数据加载器实现
    1、torch.utils.data.Datasettorch.utils.data.Dataset是代表自定义数据集方法的类,用户可以通过继承该类来自定义自己的数据集类,在继承时要求用户重载__len__()和__getitem__()这两个魔法方法。len():返回的是数据集的大小。我们构建的数据集是一个对象,而数据集不像序列类型(列表......
  • Unity热更学习toLua使用--[1]toLua的导入和默认加载执行lua脚本
    [0]toLua的导入下载toLua资源包,访问GitHub项目地址,点击下载即可。将文件导入工程目录中:导入成功之后会出现Lua菜单栏,如未成功生成文件,可以点击GenerateAll重新生成(注意很可能是路径问题导致的生成失败!)之后就可以开始编写脚本执行第一个lua程序了![1]C#调用Lua脚本编写C#......
  • HarmonyOS 实现下拉刷新,上拉加载更多
    组件介绍PullToRefreshList允许用户通过下拉动作来刷新列表内容,以及通过上拉动作来加载更多的数据。组件内部封装了滚动监听、状态管理和动画效果,使得开发者可以轻松集成到自己的项目中。1.实现思路封装成可复用的公共控件:将下拉刷新和上拉加载更多功能封装为一个可复用的组......
  • 在IDEA中加载OpenJDK源码
    之所以要阅读OpenJDK源码,是因为SunJDK的某些源码是缺失的,以JDK1.8为例,sun.reflect,sun.rmi及其子包下的类都是没有源码的。如下以下载OpenJDK1.8源码为例进行说明。下载OpenJDK源码文件,如下载zip格式的压缩包。解压OpenJDK源码压缩包文件,在IDEA中按如下路径加载:【File】......
  • Echarts -- 实现动态加载series
    Echarts--实现动态加载series:https://blog.csdn.net/m0_74444744/article/details/134467184?ops_request_misc=&request_id=&biz_id=102&utm_term=echarts%20series&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-1344671......
  • Spring学习之——Bean加载流程
    Spring IOC容器就像是一个生产产品的流水线上的机器,Spring创建出来的Bean就好像是流水线的终点生产出来的一个个精美绝伦的产品。既然是机器,总要先启动,Spring也不例外。因此Bean的加载流程总体上来说可以分为两个阶段:容器启动阶段Bean创建阶段一、容器启动阶段:容器的启动阶......
  • Sxstrace.exe 是 Windows 操作系统提供的一个工具,用于跟踪和分析应用程序的依赖项解析
    sxstrace|MicrosoftLearnSxstrace.exe是Windows操作系统提供的一个工具,用于跟踪和分析应用程序的依赖项解析过程。该工具可以帮助用户诊断应用程序启动或运行时出现的依赖项错误或加载问题。在Windows中,许多应用程序依赖于共享组件和库文件,如动态链接库(DLL)。当应用......
  • 解决创建SpringBoot工程加载较慢的问题
    设置ServerURL将https://start.spring.io改为https://start.aliyun.com如图所示:启动演示如图所示,启动成功......