自定义 Java ClassLoader

自定义classloader的使用 立即下载

首先看一下 java.lang.ClassLoader 方法 loadClass(String name) 方法的源码

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

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class c = findLoadedClass(name);//检查,class是否已经被加载过了,如果加载过了就不会再加载,防止重复加载。
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);//如果没有被加载,则交给父类 ClassLoader 进行加载,java的双亲委派类加载机制
                    } else {
                        c = findBootstrapClassOrNull(name);//如果没有父类加载器,则 直接交给最顶层的 类加载器进行加载。
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
                if (c == null) {//如果父类加载器,也没有加载到,调用 findClass 方法。
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);//findClass 源码,见下面。
                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
    /**
     * 关于方法 resolveClass 的解释
     * Links the specified class.  This (misleadingly named) method may be
     * used by a class loader to link a class.  If the class <tt>c</tt> has
     * already been linked, then this method simply returns. Otherwise, the
     * class is linked as described in the "Execution" chapter of
     * <cite>The Java&trade; Language Specification</cite>.
     * </p>
     *
     * @param  c
     *         The class to link
     *
     * @throws  NullPointerException
     *          If <tt>c</tt> is <tt>null</tt>.
     *
     * @see  #defineClass(String, byte[], int, int)
     */
                resolveClass(c);
            }
            return c;
        }
}
//什么都没有,就是简单抛出一个 Exception
protected Class<?> findClass(String name) throws ClassNotFoundException {
        throw new ClassNotFoundException(name);
}

通过分析源码,我们知道要自定义 ClassLoader 那么继承 ClassLoader 重写 findClass 方法就行了。

示例代码
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;
public class MyClassLoader extends ClassLoader {

      @Override
      protected Class<?> findClass(String name) throws ClassNotFoundException {
            Class<?> c = null;
            try {
                  byte[] data = getClassFileBytes(name);
                  c = defineClass(name, data, 0, data.length);//name参数是要加载类的 package
            } catch (Exception e) {
                  e.printStackTrace();
            }
        return c;
      }

      private byte[] getClassFileBytes(String name) throws Exception {
        String path = "D:\\MyEclipse 10\\jd-finance-platform\\AtestJDK1-8\\bin\\";
        String classPath = name.replace(".", "\\") + ".class";
        //class 文件的存放路径
        String classFile = path + classPath;
        FileInputStream fis = new FileInputStream(classFile);
        FileChannel fileC = fis.getChannel();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        WritableByteChannel outC = Channels.newChannel(baos);
        ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
        while (true) {
            int i = fileC.read(buffer);
            if (i == 0 || i == -1) {
                break;
            }
            buffer.flip();
            outC.write(buffer);
            buffer.clear();
        }
        fis.close();
        return baos.toByteArray();
    }

}

测试代码
public class Test{ 

    public static void main(String[] args) throws Exception{ 
      MyClassLoader myc = new MyClassLoader();
      Class<?> c = myc.loadClass("com.lp.jdk18.JDK18");//字符串是要加载类的 package
      Object obj = c.newInstance();
      System.out.println(obj);
      System.out.println(obj.getClass().getClassLoader());
      System.out.println(obj.getClass().getClassLoader().getParent());
    }

}

输出结果
com.lp.jdk18.JDK18@520b368f
com.lp.classload.MyClassLoader@77f2fbff
sun.misc.Launcher$AppClassLoader@15b94ed3
​​10.3 时间敏感网络(TSN)协议适配​ 本文探讨了时间敏感网络(TSN)协议在PCIe网络加速卡开发中的适配方案,重点分析了时间同步、流量调度和冗余传输三大核心问题。研究从协议实现、硬件加速设计和驱动优化三个维度展开,提出采用FPGA实现PTP时钟同步、动态TAS调度器以及双路径冗余传输等技术方案。通过工业控制网络案例验证,该方案将端到端延迟从120μs降至8μs,带宽利用率提升至92%,同时实现了100%的确定性保障。研究还总结了调试工具和典型问题解决方法,为TSN在PCIe网络中的实际应用提供了技术参考。 阅读详情

相关推荐

数据可视化—power bi 基础操作汇总

数据来源: https://pan.baidu.com/s/1U_Y7rKfhnSKbLmh4FcUD_Q 提取码: yq5v 目录 基本功能与视图 编辑与查询—修改column案例 建立关联性 新增column与DAX完成总价运算 习题练习1:建立可视化图表 产品销售统计图 column拖曳可视化 1.基本功能与视图 ①基础操作界面 ②获取数据—以打开excel为例 ③数据文件基本视图 可视化形式:柱状图、数据、关联性 2.编辑与查询—修改column ①编辑与查询—数据处理界面 .

weixin_52730784的博客 2683

使用Java实现自定义的ClassLoader

继承类。重写findClass方法,在该方法中实现自定义的类加载逻辑。调用方法将字节码转换为Class对象。下面是一个简单的示例代码,演示如何实现一个自定义ClassLoader。这个ClassLoader会从指定的目录中加载类文件。在main方法中,我们创建了一个实例,并尝试加载一个类。加载成功后,实例化该类并打印出其ClassLoader。

weixin_53840353的博客 1772

Dify+MCP Server打造禅道AI智能助手

Dify AI与MCP Server结合打造的禅道AI智能助手,实现了项目管理智能化升级。该方案通过大语言模型和自动化工作流,提供四大核心功能:1)自动化报表生成,支持多维度数据统计与可视化;2)禅道系统管理操作,简化产品/项目/任务管理流程;3)基于知识库的智能问答系统;4)数据库灵活查询与可视化输出。系统采用分层架构,通过MCP协议实现AI与数据源解耦,解决了传统禅道在数据孤岛、工具碎片化等问题。实际应用验证了其在用户管理、任务创建、Bug处理等场景的高效性,显著提升了项目管理效率。

oNew_Lifeo的博客 1710

java自定义类加载器(ClassLoader)(初学者自用)

自定义类加载器是通过继承ClassLoader类重写其中的findClass方法。其余是我们加载某个类中的对象,然后调用里面的方法得到的。1、来到你的.java文件目录下面。目录中出现.class文件代表成功。第一个是读取的二进制的完整的路径。第三个是我们自定义类加载器的父类。第二个是我们自定义的类加载器。输入你的java文件,如下图。怎么获得.class文件。2、输入cmd,回车。

qq_61839608的博客 784

基于ESP32的摩托车蓝牙对讲系统开发实践

蓝牙音频传输技术在现代通信中扮演着重要角色,其核心原理是通过无线射频实现数字音频信号的双向传输。在工程实践中,蓝牙HFP协议常用于语音通信场景,而ESP32等嵌入式平台因其低成本和高集成度成为DIY项目的理想选择。本项目通过ESP32-WROOM-32D开发板结合PCM5102 DAC和INMP441数字麦克风等模块,构建了一套摩托车骑行专用的蓝牙对讲系统。该系统特别针对高速移动环境下的风噪抑制和连接稳定性进行了优化,采用数字信号处理技术实现实时降噪,并通过I2S接口确保音频质量。这种方案不仅成本控制在30

weixin_33239721的博客 414

杰理芯片外挂Flash音乐播放功能避坑指南(附FAT文件系统配置)

本文详细解析了杰理芯片外挂Flash实现音乐播放功能的技术要点与常见问题,包括硬件连接、SPI驱动配置、FAT文件系统烧录及音乐播放集成等关键环节。特别针对Flash选型、FAT文件系统配置等易错点提供实用解决方案,帮助开发者高效完成嵌入式音频系统开发。

yhn45678901的博客 834

java 自定义classloader

java中默认提供了三类classloader,分别加载不同目录下的class或者jar包,如果有一些非通用的需求,比如想从一个特定的位置加载class,如http地址、网盘、U盘等;又比如想对class做一些隔离;这个时候,默认的classloader就不能满足要求了,需要自定义classloader 自定义classloader很简单, (1)继承java.lang.ClassLoader...

韦远科的专栏 1275

Python爬虫实战:模拟登录B站 – 处理Cookie和加密参数

由于B站在登录过程中采用了多种安全措施,包括加密的请求参数和cookie验证,模拟登录成为一项具有挑战性的任务。首先,我们需要获取B站的登录页面,并解析出其中的CSRF令牌和其他隐藏的字段。B站的登录接口通常会包含一些动态的加密参数,我们需要在登录前通过GET请求获取这些信息。本文详细介绍了如何使用Python模拟登录B站,解决加密参数的处理、图形验证码的识别以及登录后的数据抓取。库中的加密方法加密登录请求中的密码。一旦登录成功,我们可以通过维护会话状态,抓取登录后的数据,如个人主页、评论、观看记录等。

2201_76125261的博客 1310

自定义ClassLoader

自定义ClassLoader

阿昊的博客 2434

【OpenClaw企业级智能体实战】第11篇:制造业设备预测性维护实战——OpenClaw+DeepSeek+Prometheus从零搭建(附完整代码)

本文聚焦制造业设备预测性维护的核心痛点,基于OpenClaw v2026.2.1、DeepSeek智能诊断、Prometheus监控等工具,拆解“设备状态监控→智能故障诊断→预测性维护”三大核心场景。从技术原理、算法构建、实操流程到完整代码实现,提供“数据采集→模型训练→智能调度→自动处置”的全链路方案。方案遵循工业安全规范,采用“只读优先、权限最小化”原则,适配中小制造企业落地需求。通过虚拟案例验证,可使设备非计划停机时间下降65%、平均修复时间缩短47%,既适合新手快速入门,也为进阶读者提供架构优化思路

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 607

[Dify实战] 多轮对话状态管理:上下文保持与槽位填充

本文探讨了基于LLM的对话应用中多轮对话状态管理的核心挑战与解决方案。文章指出,单纯的"能聊"远远不够,关键在于建立有效的状态管理机制,包括上下文保持和槽位填充两大核心能力。通过Dify实战视角,详细阐述了如何设计工程化落地方案:采用混合策略的上下文管理(窗口+摘要+关键槽位)、JSON Schema强约束的槽位抽取、统一状态对象存储、冲突处理机制和优化追问策略。文章特别强调,合理的状态管理能将"聊天"转化为"可执行的业务流程",避免模型成为&qu

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 240

java 自定义classloader_自定义ClassLoader

由于ClassLoader的单亲委托结构,保证了JVM中加载的类的安全性。BootstrapClassloader会加载java核心库(例如:java.lang.*等);ExtClassloader会加载jdk安装目录下的ext目录下的jar包(即jdk1.6.0_18\jre\lib\ext),包括dnsns.jar、sunjce_provider.jar...等;AppClassloader会...

weixin_29585753的博客 780

Android15音频进阶之4种调试线程死锁利器(八十九)

本篇目的:Android15音频进阶之4种调试线程死锁利器对于开发者来说,最令人头疼的,莫过于多线程交互出问题的时候,我们应该从哪里找突破口呢?下面来介绍一下调试Android音频中线程死锁的四种方案线程死锁是并发编程中常见的问题之一,它指的是在多个线程竞争资源的过程中,由于相互等待对方持有的资源而无法继续执行,从而导致所有线程都无法向前推进的现象。死锁不仅会导致系统性能严重下降,甚至可能导致整个系统崩溃。线程死锁的产生有四个必要条件:互斥条件:资源不能被多个线程共同使用,只能由一个线程独占。

Android系统攻城狮 1998

java 自定义 classloader

Java自定义ClassLoader科普 Java的ClassLoader是用于加载类文件的组件,它在Java程序运行时起着至关重要的作用。Java虚拟机(JVM)提供了多种ClassLoader,但是有时候,我们可能需要自定义ClassLoader来满足特定的需求。本文将介绍如何自定义ClassLoader,并提供代码示...

weixin_40288372的博客 209

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

自定义 Java ClassLoader:深入探索

在自定义 ClassLoader 之前,我们需要了解 Java 类加载器的工作原理。Java 类加载器遵循所谓的“双亲委派模型”。简单来说,当一个类加载器收到类加载请求时,它会先将这个请求委托给父类加载器去完成,只有在父类加载器无法完成请求时,自己才会尝试去加载这个类。这种模型确保了 Java 核心库的稳定,并避免了类的重复加载。然而,这也限制了我们在某些情况下对类的加载方式的控制。为了打破这个限制,我们可以创建自己的类加载器。要自定义一个 ClassLoader,我们需要继承findClass和。

编程思维 759

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

利用自定义的 ClassLoader 加密 Java Class 文件

本文演示利用自定义的 ClassLoader 加密 Java Class 文件 首先,我们定义一个需要被加密的Java Class: classload.MyClassBase。 为了让客户端使用,需要定义一个 MyClassInterface, 这样客户端就不会直接引用 MyClassBase了,发布到客户端的class文件中是不存在 MyClassBase这个类的。 MyC

刘勇的专栏 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java_ClassLoader(ClassLoader / 自定义ClassLoader / DexClassLoader)

Java_ClassLoader(ClassLoader / 自定义ClassLoader / DexClassLoader) 本文由 Luzhuo 编写,转发请保留该信息. 原文: http://blog.youkuaiyun.com/rozol/article/details/77758194 ClassLoader 用来动态加载class文件到内存中使用的 ClassLoa...

Luzhuo 的博客 732

java classloader 加密_自定义ClassLoader进行class文件加密

1.基础使用ClassLoader1.1 创建自定义ClassLoader并继承ClassLoader这里我只覆写了一个findClass方法(实际上可以覆写更多方法)因为在下文我需要达到加密class,需要覆写该findClass(),在该findClass里,调用了我自己写的一个method:getClassByte(),该方法的作用是读取class文件字节流,那么我们的加密手段,可以在该方法...

weixin_30768979的博客 1169

Java 自定义classloader 最简单的实现就是继承URLClassLoader

package demo; import java.io.File; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; import co...

修也 2416

自定义classloader加密java程序

大概想法是这样的:  1. 生成密钥用于在des算法中加密。  2. classloader类中动态的解密class,并且通过反射机制执行main方法。  3. 对classloader类进行高质量的混淆。  首先需要生成des算法中的key:  Java代码   import java.io.File;   import java.io.FileOu

Amy的专栏 1655

Java 自定义ClassLoader

双亲委派模型 不是继承关系,是组合关系. 子加载器拥有父加载器的实例 加载流程,如下: 1. 当前类加载器首先查询该类是否已加载, 若没加载,则跳(2) 2. 委托父加载器加载,父加载器执行相同的操作,如加载失败,则跳(3) 3. 使用启动类加载器加载, 若报错,则跳(4) 4. 使用自身去加载,若报错,则加载失败[1,2,3]的实现在ClassLoader#loadClass方法中[4

ACMer_AK的博客 704

java 中自定义字段的实现方案_Java自定义ClassLoader实现

Java自定义ClassLoader实现上文说Java中的ClassLoader机制,在文章末尾说要自定义一个类加载器,现在就来实现下。实现自定义ClassLoader前文说过如果通过classLoader的loadClass方法来加载类,需要实现findClass方法,在这个方法中自定义获取文件的字节数组,再调用defineClass方法实现类的加载。说明:如果不通过loadClass来加载类,...

weixin_35079766的博客 293

java 指定classloader_java自定义ClassLoader加载指定的class文件实现例子

java自定义ClassLoader加载指定的class文件实现例子SyncExternalClassLoader loader = new SyncExternalClassLoader();Class> aClass = loader.findClass("bug");object = aClass.newInstance();public class SyncExternalClass...

weixin_33732812的博客 280

java classloader 热部署_自定义ClassLoader实现java应用核心逻辑模块热部署

本文主要是根据classloader的特性,结合实际产品环境中遇到的问题,来探讨下JAVA应用中局部模块热部署的可行性。我们知道,一些web应用提供了自动检测装载webapp的功能,但大部分的时候,就是相当于重新启动了一遍Webapp,存储在内存中的数据也会丢失,并不能灵活地满足需要。而OSGI框架,虽然也提供了模块的热部署,但为了用热部署而将应用限制在OSGI的框框中,有些时候得不偿失。于是想根...

weixin_31544167的博客 335

自定义classloader实现java程序加密

自定义classloader实现java程序加密 背景 项目使用java语言开发,发布包会整合到C++客户端,直接安装到用户机器上,不同于之前常见的后端服务发布,这种发布能让用户直接接触到java发布包,由于java语言的特性,有可能出现java发布包被反编译的情况,所以决定对java发布包进行加密处理。 ClassLoader概述 java编译后的class文件由classloader(类加载器...

weixin_42406770的博客 975

java自定义classloader引发的思考

引用 java类的热替换 classloader机制 如下图所示,java的classloader是双亲委派机制。会首先从父classloader加载指定的class,如果加载不到才会从子classloader中加载。 主要这里的图片主要用于体现classloader的父子关系,实际上实现时并不一定存在继承关系。比如AppClassLoader的父classLoader是ExtC...

airuochuang9338的博客 213
上一篇: 使用redis创建自己的分布式锁
下一篇: 创建型-单例模式
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值