一个简单的自定义ClassLoader的实现

昆仑通态屏幕制作(连载1)---接触篇 写在开始 背景:最近出了做QT、LORA和4G,还做了一个屏幕。以前做了一个迪文的串口屏幕,发现网上的教程很多,所以连载就不更新了,并且迪文屏幕的设置什么的比较简单,应该从网上都能找到对应的教程。而现在用的昆仑通态的屏幕属于嵌入式屏幕,至于为啥叫嵌入式,也不是很明白,反正就是需要用这个屏幕,嵌入式不嵌入式不重要了。重要的是能用,并且能实现串口屏幕不能实现的功能。所以选定昆仑通态的一款屏幕。 文章语言:我比较习惯用比较糙的语言介绍做的东西,有时候不太准备,但是为了方便理解,还请大家谅解。用... 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 很多时候人们会使用一些自定义的ClassLoader ,而不是使用系统的Class Loader。大多数时候人们这样做的原因是,他们在编译时无法预知运行时会需要那些Class。特别是在那些appserver中,比如tomcat,Avalon-phonix,Jboss中。或是程序提供一些plug-in的功能,用户可以在程序编译好之后再添加自己的功能,比如ant, jxta-shell等。定制一个ClassLoader很简单,一般只需要理解很少的几个方法就可以完成。 一个最简单的自定义的ClassLoader从ClassLoader类继承而来。这里我们要做一个可以在运行时指定路径,加载这个路径下的class的ClassLoader。 通常我们使用ClassLoader.loadClass(String):Class方法,通过给出一个类名,就会得到一个相应的Class实例。因此只要小小的改动这个方法,就可以实现我们的愿望了。 源码: protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { // First, check if the class has already been loaded Class c = findLoadedClass(name); if (c == null) { try { if (parent != null) { c = parent.loadClass(name, false); }else{ c = findBootstrapClass0(name); } }catch(ClassNotFoundException e){ // If still not found, then call findClass in order // to find the class. c = findClass(name); } } if (resolve) { resolveClass(c); } return c;} Source from ClassLoader.java First,check JavaAPI doc:上面指出了缺省的loadClass方法所做的几个步骤。 1. 调用findLoadedClass(String):Class 检查一下这个class是否已经被加载过了,由于JVM 规范规定ClassLoader可以cache它所加载的Class,因此如果一个class已经被加载过的话,直接从cache中获取即可。 2. 调用它的parent 的loadClass()方法,如果parent为空,这使用JVM内部的class loader(即著名的bootstrap classloader)。 3. 如果上面两步都没有找到,调用findClass(String)方法来查找并加载这个class。 后面还有一句话,在Java 1.2版本以后,鼓励用户通过继承findClass(String)方法实现自己的class loader而不是继承loadClass(String)方法。 既然如此,那么我们就先这么做:) public class AnotherClassLoader extends ClassLoader { private String baseDir;private static final Logger LOG = Logger.getLogger(AnotherClassLoader.class); public AnotherClassLoader (ClassLoader parent, String baseDir) { super(parent); this.baseDir = baseDir; } protected Class findClass(String name) throws ClassNotFoundException { LOG.debug("findClass " name); byte[] bytes = loadClassBytes(name); Class theClass = defineClass(name, bytes, 0, bytes.length);//A if (theClass == null) throw new ClassFormatError(); return theClass; } private byte[] loadClassBytes(String className) throws ClassNotFoundException { try { String classFile = getClassFile(className); 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(); } catch (IOException fnfe) { throw new ClassNotFoundException(className); } } private String getClassFile(String name) { StringBuffer sb = new StringBuffer(baseDir); name = name.replace('.', File.separatorChar) ".class"; sb.append(File.separator name); return sb.toString(); }} [i]Ps:这里使用了一些JDK1.4的nio的代码:)[/i] 很简单的代码,关键的地方就在A处,我们使用了defineClass方法,目的在于把从class文件中得到的二进制数组转换为相应的Class实例。defineClass是一个native的方法,它替我们识别class文件格式,分析读取相应的数据结构,并生成一个class实例。 还没完呢,我们只是找到了发布在某个目录下的class,还有资源呢。我们有时会用Class.getResource():URL来获取相应的资源文件。如果仅仅使用上面的ClassLoader是找不到这个资源的,相应的返回值为null。 同样我们看一下原来的ClassLoader内部的结构。 public java.net.URL getResource(String name) { name = resolveName(name); ClassLoader cl = getClassLoader0();//这里 if (cl==null) { // A system class. return ClassLoader.getSystemResource(name); } return cl.getResource(name);} 原来是使用加载这个class的那个classLoader获取得资源。 public URL getResource(String name) { URL url; if (parent != null) { url = parent.getResource(name); } else { url = getBootstrapResource(name); } if (url == null) { url = findResource(name);//这里 } return url;} 这样看来只要继承findResource(String)方法就可以了。修改以下我们的代码: //新增的一个findResource方法protected URL findResource(String name) { LOG.debug("findResource " name); try { URL url = super.findResource(name); if (url != null) return url; url = new URL("file:///" converName(name)); //简化处理,所有资源从文件系统中获取 return url; } catch (MalformedURLException mue) { LOG.error("findResource", mue); return null; }}private String converName(String name) { StringBuffer sb = new StringBuffer(baseDir); name = name.replace('.', File.separatorChar); sb.append(File.separator name); return sb.toString();} 好了,到这里一个简单的自定义的ClassLoader就做好了,你可以添加其他的调料(比如安全检查,修改class文件等),以满足你自己的口味:)
汽车行业新能源汽车数据爬虫:抓取新能源汽车数据,分析市场发展和技术创新 在汽车行业,新能源汽车市场的发展和技术创新是当前的热点话题。通过抓取新能源汽车的数据,我们可以深入了解市场趋势、消费者需求以及技术创新的方向。本文将详细介绍如何使用 Python 爬虫技术抓取新能源汽车数据,并对数据进行分析和可视化展示。 阅读详情

相关推荐

手动安装SeuratData包中pbmc3k数据集的详细步骤与避坑指南

本文提供了手动安装SeuratData包中pbmc3k数据集的详细步骤与避坑指南。针对国内用户网络不稳定导致自动下载失败的问题,文章核心介绍了如何从错误信息中获取下载链接,使用浏览器或下载工具完成手动下载,并通过指定本地文件路径和参数在R中成功安装。该方法同样适用于SeuratData包中的其他数据集,是单细胞分析入门的必备生存技能。

weixin_29054399的博客 185

ClassLoader_类加载器

2.没有加载过 且 有父加载器,调用父加载器 loadClass,没有父加载器(即当前为Bootstrap类加载器),调用findBootstrapClassOrNull(name) 从Bootstrap类加载器负责的范围中加载所需的类。从父加载器中没有加载到需要的类,再调用 当前类加载器findClass(name) 去加载所需要的类。结果:加载的是类路径外 jar 中的Calculator 类。自定义类加载器从jar中读取修改后的class文件。结果:加载的是类路径下 的Calculator 类。

weixin_41812346的博客 1795

ESP32-IDF HTTP服务器实战:从零搭建Web控制界面

本文详细介绍了如何在ESP32平台上使用ESP-IDF框架从零搭建HTTP服务器,并创建Web控制界面。内容涵盖环境配置、服务器基础设置、Web页面处理、GPIO控制接口实现及AJAX异步请求处理,帮助开发者快速掌握物联网设备Web控制开发。

efc123456的博客 1063

自定义ClassLoader

自定义ClassLoader

阿昊的博客 2434

斑马打印机状态监控进阶:不用SDK也能获取打印状态的3种野路子

本文介绍了三种不依赖官方SDK的斑马打印机状态监控方法,包括SGD命令、TCP端口嗅探和共享打印机日志分析。这些方案适用于老旧系统或网络受限环境,帮助运维人员实时掌握打印状态,提升设备管理效率。特别适合工业自动化和物流仓储场景中的应急处理。

weixin_42628688的博客 429

2026闲鱼数据采集实战:本地YOLO识别滑块验证码+接口签名分析+零成本价格监控系统

2026闲鱼反爬系统升级实战:零成本解决方案 本文针对2026年闲鱼最新反爬机制提出了一套完整的零成本解决方案。系统面临四大挑战:AI滑块验证、接口签名升级、设备指纹绑定和精细化行为检测。通过以下技术突破实现稳定运行: 本地化AI破解:训练YOLOv11n模型实现98%准确率的滑块识别,替代付费打码平台 逆向工程:Hook闲鱼App签名算法,用Python重写HMAC-SHA256签名生成器 设备指纹管理:建立"一机一号一IP"机制,维护50+种设备特征 行为模拟:开发四阶段滑动轨迹模型

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1462

【JVM】类加载器(一):类加载机制及自定义ClassLoader

入口,定义了 加载/寻找 Class 的策略。比如双亲委派,或者其他形式调用 findClass() 读入 class 文件,并生成 Class 对象根据 class 名,在当前 ClassLoader 能处理路径中查找,如果能找到就将 class 文件读入调用 defineClass 生成 Class 对象native 方法将字节数组生成 Class 对象。

A minor 1720

Excel也能玩转K-means聚类?手把手教你用表格搞定用户分群(附完整公式)

本文详细介绍了如何在Excel中实现K-means聚类算法,无需编程即可完成用户分群。通过SUMIF、SQRT等基础函数,从数据预处理到最终分群全流程手把手教学,特别强调数据标准化和迭代优化的关键步骤,帮助运营团队低成本高效分析用户行为数据。

weixin_30555125的博客 181

实现一个自己的ClassLoader

ClassLoader 简介   ClassLoader 在 Java 中有着非常重要的作用,它主要工作在 Class 装载的加载阶段。 其主要作用是从系统外部获得 Class 二进制数据流。 它是 Java 的核心组件,所有的 Class 都是由 ClassLoader 加载的,ClassLoader 负责通过将 Class 文件里的二进制数据流装载进系统,然后交给 Java 虚拟机进...

To be a great coder 925

13《CAN总线五种错误类型,故障判定全解析》

CAN总线规定,发送节点在发送完EOF字段后,会留出一个ACK Slot(应答槽)。这个槽里,发送节点自己会输出隐性电平(逻辑1),然后“期待”至少有一个其他节点在这个槽里把它拉成显性电平(逻辑0)。如果这个槽结束时仍然是隐性电平,发送节点就判定:刚才那帧报文,没有任何一个节点成功接收——这就是应答错误。简单说,就是“我喊了一嗓子,却没人应声”。

2401_88858637的博客 267

17、自适应和学习索引:在线物理设计调整的新维度

本文探讨了现代数据库管理系统中自适应索引和数据库裂解的新方法,通过结合学习模型与多臂老虎机(MAB)框架,实现在线物理设计调整。文章详细介绍了自适应索引的工作原理、数据库裂解技术以及如何利用机器学习进行索引选择和优化,并讨论了MAB框架在动态调整索引结构中的应用及其实际案例。

go5gopher的博客 83

Android之ClassLoader

参考资料参考资料; 包括热修复;背景介绍Java程序是由一个个.class文件组成的,在程序执行阶段,JVM采用了动态加载的策略,当一个类被使用时,将由一个ClassLoad实例去加载这个.class文件。Java允许我们从外部加载一个类到内存中,然后使用它。有关ClassLoaderJava中ClassLoader的分类(1) BootstarpClassLoad:启动类加载器,它负责在程序启动

chice的博客 1550

Python爬虫-爬取猫眼演出数据

本文是该专栏的第53篇,后面会持续分享python爬虫干货知识。猫眼平台除了有影院信息之外,它还涵盖了演出信息,比如说“演唱会,音乐节,话剧音乐剧,脱口秀,音乐会,戏曲艺术,相声”等等各种演出相关信息。而本文,笔者将以猫眼平台为例,基于Python爬虫实现获取各种演出信息的数据。废话不多说,具体细节部分以及详细思路逻辑,笔者将在正文结合完整代码进行详细说明。(附带完整代码)

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 572

java自定义ClassLoader实例代码

闲来无事,看看jvm,看到自定义的classLoder,就写了一个实例,希望对大家有所帮助,欢迎批评指正 首先,自定义的classloader需要继承java的classLoder类,同时覆写findClass方法,废话不说了,直接上代码 MyClassLoader:自定义的classloader import java.io.ByteArrayOutputStream; import

liuxiaochen123的专栏 1704

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

实现自定义类加载器-ClassLoader

JAVA启动后,是经过JVM各级ClassLoader来加载各个类到内存。为了更加了解加载过程,我通过分析和写了一个简单的ClassLoader来粗浅的分析它的原理。 JVM的ClassLoader分三层,分别为Bootstrap ClassLoader,Extension ClassLoader,System ClassLoader,他们不是类继承的父子关系,是逻辑上的上下级关系。 Boot

零度的博客专栏 2117

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深入了解Java ClassLoader、Bytecode 、ASM、cglib

一、Java ClassLoader 1,什么是ClassLoader 与 C 或 C++ 编写的程序不同,Java 程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件对应于一个 Java 类。 此外,这些类文件并非立即全部都装入内存,而是根据程序需要装入内存。ClassLoader 是 JVM 中将类装入内存的那部分。 而且,Java ClassLoader 就...

bubblebaby的专栏 145

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深入了解Java ClassLoader

一、Java ClassLoader 1,什么是ClassLoader 与 C 或 C++ 编写的程序不同,Java 程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件对应于一个 Java 类。 此外,这些类文件并非立即全部都装入内存,而是根据程序需要装入内存。ClassLoader 是 JVM 中将类装入内存的那部分。 而且,Java ClassLoader 就是用 Java 语言...

java开发指南博客 【转载】 78

基于ClassLoader的简单自定义类加载器

一、实现方法 最近excel工具包正在研究如何动态注入模板文件,妄图实现的功能是实现对正在运行的代码进行不停机的模板注入,顺便也加深自己对反射的理解,使用了一下自定义的类加载器。 后续可能还会加入支持数据库表的自定义模板。 核心思想,继承ClassLoader并重写findClass方法 原有的ClassLoader中,如果我们能够在类路径下找到相应的类,是可以使用Class.LoadClass直接反射的,如果找不到,就会在findClass这里抛出异常。 protected Class<?>

blowbob_666的博客 255

Java -- Class装载机制及ClassLoader

Java – Class装载机制及ClassLoader

曦轩 技术茶话小屋 3628

Java ClassLoader实现热加载

关于热加载 热修复当前是很流行的技术,在Android平台,我们可以使用Andfix、Hotfix和Tinker等技术。实际上,在java程序中,热修复技术远比...

M_Andrain的博客 86

Java实现简单的自定义类加载器代码示例

此外,在main方法中,使用了loadClass方法来加载类,而不是直接调用findClass。这是因为loadClass方法实现了双亲委派模型,首先会委托给父类加载器加载类,如果父类加载器加载不到,才会调用自己的findClass方法。在Java中,实现一个简单的自定义类加载器可以通过继承java.lang.ClassLoader类并重写findClass方法来完成。请注意,在上面的示例中,loadClassData方法只是从文件系统的"classes"目录加载类文件。

DKPT的博客 1163

Custom ClassLoader

package com.loader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; /* /Bootstrap Classloader -&gt; rt.jar Extension Classload...

ReZero's Blog 459
上一篇: Java Interface 是常量存放的最佳地点吗?
下一篇: 使用NewsML组织企业新闻资源
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值