首页 > 其他分享 >JVM自定义加类加载器

JVM自定义加类加载器

时间:2024-05-13 15:10:16浏览次数:13  
标签:JVM 自定义 方法 findClass 加类 重写 加载

  在JVM类加载器分类中提及JVM自带的加载器无法满足实际业务需求时,可以自定义加载器。那一般什么情况下需要自定义加载器呢?

    • 隔离加载类:模块隔离——把类加载到不同的应用选项中,比如Tomcat类加载器。
    • 修改类加载方式:平台提供了三类加载器除必须加载的类加载器,可以根据实际情况按需动态加载。
    • 扩展加载源:比如还可以从数据库、网络、或其他终端上加载。
    • 防止源码泄漏:java代码容易被编译和篡改,可以进行编译加密,类加载需要自定义还原加密字节码。

  自定义类加载器中方法如何调用呢?在JVM类加载器ClassLoader源码剖析对平台提供的类加载器各方法有了一定了了解大致如下:

                

  对上图中三个方法,可以通过重写loadClass和findClass方法对类加载器按需自定义(defineClass使用final修饰不可重写,只能继承):

    1)重写loadClass方法(是实现双亲委派逻辑的地方,修改他会破坏委派机制,不推荐)
    2)重写findClass方法 (推荐)

  下面示例重写findClass方法自定义类加载器,同时调试跟踪是否实现了自定义功能:

                

                

                

  测试:

                

  跟踪调试分析MyClassLoader:

         

                

                

  上图中查找加载内容的过程就是双亲委派机制:

    1. 首先,检查一下指定名称的类是否已经加载过,如果加载过了,就不需要再加载,直接返回。
    2. 如果此类没有加载过,那么,再判断一下是否有父加载器;如果有父加载器,则由父加载器加载(即调用 parent.loadClass(name, false); ).或者是调用 bootstrap 类加载器来加载。
    3. 如果父加载器及 bootstrap 类加载器都没有找到指定的类,那么调用当前类加载器的 findClass 方法来完成类加载。

 

        

标签:JVM,自定义,方法,findClass,加类,重写,加载
From: https://www.cnblogs.com/ilovebath/p/18188907

相关文章

  • JAVA Comparator 自定义排序 源码分析
    对于一个数组来说如果我们想要从大到小排序一般会这么写Integer[]nums={1,2,3};Arrays.sort(nums,newComparator<Integer>(){@Overridepublicintcompare(Integera,Integerb){returnb-a;}});......
  • Go语言异常处理:自定义错误【errors.New+panic】
    程序本身抛出的异常信息不是太友好,我们可以自定义错误或者异常的信息,需要使用errors包中的New函数来包装一下异常或错误信息;在使用内置函数panic(err),把异常信息后面的程序执行终止掉,因为再执行后面的程序也没有意义了。 packagemainimport"fmt"import"errors"funcma......
  • Tomcat中为什么要使用自定义类加载器
    Tomcat使用自定义类加载器主要是基于以下几个关键原因:1.应用隔离:Tomcat作为一个Web容器,能够同时部署和运行多个Web应用程序。每个应用可能依赖不同的库版本或者包含同名类,为了确保每个应用的类库相互独立,避免类冲突,Tomcat为每个Web应用提供了一个独立的类加载器实例,即`WebAppC......
  • Tomcat中为什么要使用自定义类加载器
    Tomcat使用自定义类加载器主要是基于以下几个关键原因:1.应用隔离:Tomcat作为一个Web容器,能够同时部署和运行多个Web应用程序。每个应用可能依赖不同的库版本或者包含同名类,为了确保每个应用的类库相互独立,避免类冲突,Tomcat为每个Web应用提供了一个独立的类加载器实例,即`WebAppC......
  • SQL Server实战七:自定义数据类型、标量值、内嵌表值、多语句表值函数的操作
      本文介绍基于MicrosoftSQLServer软件,实现数据库用户自定义数据类型的创建、使用与删除,以及标量值、内嵌表值、多语句表值函数等用户定义函数的创建、使用、删除方法。目录1用SQL语句创建一个用户定义的数据类型Idnum2使用Idnum创建学生表STUDENT与教师表TEACHER3交互式......
  • 自定义函数在LCD上显示一张不超过LCD像素大小的色深为 24bit的bmp图片
    设计程序实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。头文件包含#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<sys/mman.h>#include<linux/......
  • 自定义各类基础排序算法
    接口函数基础信息/********************************************************************* 文件名称: 数据结构中对于无序数列的排序算法* 文件作者:[email protected]* 创建日期:2024/05/11* 文件功能:对无序数列进行排序* 注意事项:None** C......
  • Blazor WebAssembly使用 AuthenticationStateProvider 自定义身份认证
    本文章以客户端基础,实现类似后台系统,进入后台控制台页面需要经过登录身份验证才可访问情况简单来时就是实现前后端分离,前端通过token和用户信息进行身份认证,或者在 AuthenticationStateProvider 实现方法 GetAuthenticationStateAsync 中调用后台接口进行身份验证安装依......
  • dotnet 使用自定义特性
    namespaceTETTD.Common{///<summary>///导入excel特性标记字段映射的列///</summary>[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field,AllowMultiple=false)]publicclassReadAttribute:Attribute{p......
  • 三分钟分享自定义表单系统开源的优势
    在数字化转型浪潮下,利用低代码技术平台、自定义表单系统开源的优势特点,可以助力企业实现高效办公,降低人工成本,从而进入流程化办公新时代。为了帮助大家了解相关信息,流辰信息与大家分享自定义表单系统开源的相关特点和优势,希望能帮助大家解决心中的疑问,更好地利用企业内部数据资源,......