自定义classloader

news/2025/11/17 8:54:14/文章来源:https://www.cnblogs.com/yg_zhang/p/19229946

1.概述

classloader 的作用是加载字节码到jvm,有些情况下,我们比如使用插件模式,可能需要自定义从外部加载插件到jvm。

2.实现过程

2.1.定义自定义classloader

package com.example.demo.loader;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class MyClassLoader extends ClassLoader {private String classPath;public MyClassLoader(String classPath) {this.classPath = classPath;}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] classData = loadClassData(name);if (classData == null) {throw new ClassNotFoundException();} else {return defineClass(name, classData, 0, classData.length);}}private byte[] loadClassData(String className) {// 将包名转换为路径String fileName = classPath + File.separator +className.replace('.', File.separatorChar) + ".class";try (InputStream is = new FileInputStream(fileName);ByteArrayOutputStream baos = new ByteArrayOutputStream()) {int ch;while ((ch = is.read()) != -1) {baos.write(ch);}return baos.toByteArray();} catch (IOException e) {e.printStackTrace();return null;}}
}

这个代码继承 classloader,并重写了findClass.

2.2.定义外部类

package com.example.demo.loader;public class MyDynamicClass {public void sayHello() {System.out.println("Hello from dynamically loaded class!");}
}

2.3. 使用自定义classloader

package com.example.demo.loader;public class ClassLoaderDemo {public static void main(String[] args) {try {// 指向 .class 文件的根目录MyClassLoader loader = new MyClassLoader("D:\\work\\research\\demo\\target\\classes");// 加载类(注意使用全限定名)Class<?> clazz = loader.loadClass("com.example.demo.loader.MyDynamicClass");// 创建实例Object instance = clazz.getDeclaredConstructor().newInstance();// 调用方法clazz.getMethod("sayHello").invoke(instance);} catch (Exception e) {e.printStackTrace();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Floyd判圈和Brent判圈

问题背景 想象一个链表,它可能在某个节点处指向一个之前的节点,从而形成一个环。 我们的目标是:判断链表中是否存在环。找到环的入口点。计算环的长度。比如说这个: 1 -> 2 -> 3 -> 4 -> 5 -> 6^ …

obet(Oracle Block Editor Tool)第二版发布

obet(Oracle Block Editor Tool)第二版发布在几天之前发布了obet的第一个版本(Oracle数据块编辑工具( Oracle Block Editor Tool)-obet),最近对功能进行了一些完善,并发布第二版(下载地址:下载obet),主要增加了以…

2025年石棉橡胶板厂家联系方式汇总:服务覆盖与区域分布

随着工业制造领域的快速发展,石棉橡胶板作为关键密封材料,在电力、石油、化工、机械等众多行业中发挥着不可替代的作用。无论是设备维护还是新项目采购,找到可靠的供应商至关重要。本文针对2025年的市场需求,汇总了…

WebStorm 2025.2.4, 11月最新版 安装、授权、使用说明

WebStorm 2025.2.4, 11月最新版 安装、授权、使用说明2025-11-11亲测 支持最新版本2025.2.4 支持Windows、MAC、Linux一 安装 官网下载 : https://www.jetbrains.com/zh-cn/rider/ 根据提示安装 二 授权说明回复 《we…

2025 最新推荐!汽车喇叭网生产厂家权威排行榜 0.01MM 精度 + 全工艺保障靠谱品牌甄选

在汽车产业向智能化、高端化深度转型的趋势下,汽车喇叭网作为影响音响音质与内饰美观的核心部件,市场需求持续攀升。据国际汽车零部件协会(IAPCA)最新测评数据显示,全球高端车型对喇叭网的精度要求已达 0.01-0.03…

2025年石棉橡胶板厂家联系方式汇总:专业服务与产品解析

随着工业领域的快速发展,石棉橡胶板作为关键密封材料在电力、石油、化工等行业中扮演着重要角色。2025年,市场需求持续增长,许多企业需要快速找到可靠的供应商进行采购或合作。本文旨在为有需求的用户提供一份详尽的…

C# Avalonia 18- ControlTemplates - ColorPickerTwoWays

C# Avalonia 18- ControlTemplates - ColorPickerTwoWays通过xaml来定义Template样式。 ColorPicker.cs代码using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Metadata; using Avalonia.Controls.Pr…

【GitHub每日速递 20251117】一款感知屏幕万物的交互式AI助手,Everywhere带你体验无缝支持! #

原文: https://mp.weixin.qq.com/s/-47OF5DvIyE5BuUsTe2msA 一款感知屏幕万物的交互式AI助手,Everywhere带你体验无缝支持! 项目地址:https://github.com/DearVa/Everywhere 主要语言:C# stars: 2.2k项目简介 “Ev…

智表ZCELL产品V3.4 版发布,新增区域筛选、字母列参等功能。

智表ZCELL产品V3.4 版发布,新增区域筛选、字母列参等功能,欢迎大家体验使用。 本次版本(V3.4)更新内容如下: 1.新增设置区域默认筛选功能SetFilterArea,支持弹出筛选框。2.新增筛选区域功能FilterArea,支持自定…

享元模式实验围棋软件

include include using namespace std; class Location { private: string x; string y; public: Location(string x, string y) { // TODO Auto-generated constructor stub this->x = x; this->y = y; } strin…

元推理品析:自指有机,自洽有缘

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891“自指有机,自洽有缘” 是对本框架生命化特质与宇宙共鸣属性的终极诗意概括,其内涵与框架公理完全同构。 终极阐述:逻辑场的生命性与宇宙缘起“自指有机”…

C#/.NET/.NET Core技术前沿周刊 | 第 61 期(2025年11.10-11.16)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与…

The 4th Universal Cup. Stage 5: Grand Prix of Nanjing 做题笔记

写下这行字的时候是 2025.11.17 8:10,比赛在一个小时十分钟前完全结束了。 队名 Endless Dream,rk256 搞笑排名。 C 签到。奇数无解,偶数输出 n/2 n/2 即可!!1 K 也是签到,但是做了三个小时!!1 一直在猜结论,…

Java开发中最那些常见的坑,你踩过几个?

大家好,我是晓凡。 作为一名Java开发者,在日常编码过程中难免会遇到各种"坑"。 有些是语法层面的问题,有些则是设计或思维上的误区。 今天我们就来盘点一下Java中最常见的20个陷阱,看看你有没有踩过这些…

量化网络风险:持续DDoS测试的运营投资回报

本文深入探讨持续DDoS测试的运营投资回报,从效率、合规性、业务连续性、风险转移和战略价值五个维度分析其为企业带来的持续价值,帮助企业全面理解DDoS防护的投资回报。量化网络风险:持续DDoS测试的运营投资回报 在…

Tenable Nessus 10.11 新增功能简介

Tenable Nessus 10.11.0 (macOS, Linux, Windows) - 漏洞评估解决方案Tenable Nessus 10.11 新增功能简介 Tenable Nessus 10.11.0 (macOS, Linux, Windows) - 漏洞评估解决方案 发布 Nessus 试用版自动化安装程序,支…

详细介绍:Vue3 表单输入绑定

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Splunk Enterprise 10.0.2 发布 - 搜索、分析和可视化,数据全面洞察平台

Splunk Enterprise 10.0.1 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台Splunk Enterprise 10.0.2 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台 Search, analysis, and visu…