深入理解Java类加载器(一):Java类加载原理解析之网络加载器

2024年最新深入理解Java类加载器(一):Java类加载原理解析之网络加载器(2),手动实现一个简单的AOP框架 谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)66个Java面试知识点架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)算法刷题(PDF)本文已被。 阅读详情

2、网络类加载器
 下面将通过一个网络类加载器来说明如何通过类加载器来实现组件的动态更新。即基本的场景是:Java 字节代码(.class)文件存放在服务器上,客户端通过网络的方式获取字节代码并执行。当有版本更新的时候,只需要替换掉服务器上保存的文件即可。通过类加载器可以比较简单的实现这种需求。

 类 NetworkClassLoader负责通过网络下载Java类字节代码并定义出Java类。它的实现与FileSystemClassLoader类似。

package classloader;  

import java.io.ByteArrayOutputStream;  
import java.io.InputStream;  
import java.net.URL;  

public class NetworkClassLoader extends ClassLoader {  

    private String rootUrl;  

    public NetworkClassLoader(String rootUrl) {  
        // 指定URL  
        this.rootUrl = rootUrl;  
    }  

// 获取类的字节码  
@Override  
protected Class<?> findClass(String name) throws ClassNotFoundException {  
    byte[] classData = getClassData(name);  
    if (classData == null) {  
        throw new ClassNotFoundException();  
    } else {  
        return defineClass(name, classData, 0, classData.length);  
    }  
}  

private byte[] getClassData(String className) {  
    // 从网络上读取的类的字节  
    String path = classNameToPath(className);  
    try {  
        URL url = new URL(path);  
        InputStream ins = url.openStream();  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        int bufferSize = 4096;  
        byte[] buffer = new byte[bufferSize];  
        int bytesNumRead = 0;  
        // 读取类文件的字节  
        while ((bytesNumRead = ins.read(buffer)) != -1) {  
            baos.write(buffer, 0, bytesNumRead);  
        }  
        return baos.toByteArray();  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return null;  
}  

private String classNameToPath(String className) {  
    // 得到类文件的URL  
    return rootUrl + "/"  
            + className.replace('.', '/') + ".class";  
    }  
}  

 在通过NetworkClassLoader加载了某个版本的类之后,一般有两种做法来使用它。第一种做法是使用Java反射API。另外一种做法是使用接口。需要注意的是,并不能直接在客户端代码中引用从服务器上下载的类,因为客户端代码的类加载器找不到这些类。使用Java反射API可以直接调用Java类的方法。而使用接口的做法则是把接口的类放在客户端中,从服务器上加载实现此接口的不同版本的类。在客户端通过相同的接口来使用这些实现类。我们使用接口的方式。示例如下:

客户端接口:

package classloader;  

public interface Versioned {  

    String getVersion();  
}  

==========

package classloader;  

public interface ICalculator extends Versioned {  

    String calculate(String expression);  
}  

网络上的不同版本的类:

package com.example;  

import classloader.ICalculator;  

public class CalculatorBasic implements ICalculator {  

    @Override  
    public String calculate(String expression) {  
        return expression;  
    }  

    @Override  
    public String getVersion() {  
        return "1.0";  
    }  
} 

=============

package com.example;  

import classloader.ICalculator;  

public class CalculatorAdvanced implements ICalculator {  

    @Override  
    public String calculate(String expression) {  
        return "Result is " + expression;  
    }  

    @Override  
    public String getVersion() {  
        return "2.0";  
    }  
} 

在客户端加载网络上的类的过程:

package classloader;  

public class CalculatorTest {  

    public static void main(String[] args) {  
        String url = "http://localhost:8080/ClassloaderTest/classes";  
        NetworkClassLoader ncl = new NetworkClassLoader(url);  
        String basicClassName = "com.example.CalculatorBasic";  
        String advancedClassName = "com.example.CalculatorAdvanced";  
        try {  
            Class<?> clazz = ncl.loadClass(basicClassName);  // 加载一个版本的类  
            ICalculator calculator = (ICalculator) clazz.newInstance();  // 创建对象  
            System.out.println(calculator.getVersion());  
            clazz = ncl.loadClass(advancedClassName);  // 加载另一个版本的类  
            calculator = (ICalculator) clazz.newInstance();  
            System.out.println(calculator.getVersion());  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}
类加载器以及SPI 目录:            申明            JVM类加载以及SPI 类的生命周期: 1.加载 2.验证 类加载器以及双亲委派模型 SPI (service provider interface) 3.准备 4.解析 5.初始化阶段 申明 本文很多的内容都是作者通过阅读《深入理解Java虚拟机[JVM高级特性与最佳实践](周志明)》这本书学习到的。如果需要关于类... 阅读详情

相关推荐

ios-网络加载器.zip

HUD1.0后感觉用起来 感觉不是很爽,于是乎自己在HUD的基础之上写了了个uiview的分类,当然也可以改成vc的分类。实现了比较小清新的效果 使用方法 只有hud隐藏后,才会去创建新的hud,否则一直复用一个hud,至于那个- (void)showTitle:(NSString *)title navigationBar:(BOOL)hiden; 是为了自己项目里加,防止位置错乱 /** * 只带文字提示 * * @param title */ - (void)showTitle:(NSString *)title; - (void)showTitle:(NSString *)title navigationBar:(BOOL)hiden; - (void)showTitle:(NSString *)title yOffset:(CGFloat)y; /** * 菊花加载 * * @param title */ - (void)showLoadMessageAtCenter; - (void)showLoadMessageAtCenter:(NSString *)title; - (void)showLoadMessageAtCenter:(NSString *)title navigationBar:(BOOL)hiden; - (void)showLoadMessageAtCenter:(NSString *)title yOffset:(CGFloat)y; /** * 网络请求成功 * * @param title */ - (void)showSuccess:(NSString *)title; - (void)showSuccess:(NSString *)title navigationBar:(BOOL)hiden; - (void)showSuccess:(NSString *)title yOffset:(CGFloat)y; /** * 网络请求失败 * * @param title */ - (void)showError:(NSString *)title; - (void)showError:(NSString *)title navigationBar:(BOOL)hiden; - (void)showError:(NSString *)title yOffset:(CGFloat)y; /** * 隐藏 */ - (void)hide;

Understanding Network Class Loaders

原文:http://www.oracle.com/technetwork/articles/javase/classloaders-140370.html 另外其它中文参考资料:http://www.iteye.com/topic/136427 Understanding Network Class Loaders ...

专偷别人的文章 196

网络类加载器实现

NULL 博文链接:https://smallbee.iteye.com/blog/2111404

Java类加载器--自定义类加载器(ClassLoader)

文章引用: https://blog.youkuaiyun.com/xyang81/article/details/7292380 既然JVM已经提供了默认的类加载器,为什么还要定义自已的类加载器呢? 因为Java中提供的默认ClassLoader,只加载指定目录下的jar和class,如果我们想加载其它位置的类或jar时,比如:我要加载网络上的一个class文件,通过动态加载到内存...

DemoTransfer 1314

树莓派c语言串口通讯程序

在网上搜了很多关于树莓派串口通讯的例子,但是都是用python写的,虽然python很有名,而且最近也在学习这门语言, 但是还是想用c语言实现一下,因为需要用到整套系统里,其他内容都是用c语言写的。但是网上没有找打现成的。 还好,之前做过天嵌2440开发板的串口程序(参照天嵌工程师提供的代码),发现串口程序其实是通用的, 驱动层屏蔽了硬件细节,个人猜测,几乎所有移植好的系统的串口,都可以用一

realank的专栏 1万+

PSM倾向匹配详细步骤和程序

目录1.安装psmatch2统计包。2.数据准备3.数据分析及命令解读4.结果解读4.1模型拟合结果,此处无太多实际意义。4.2试验组可匹配的观测概览,按照命令中设定的匹配规则,试验组有8例患者未能匹配到合适对照。4.3结果解读的重点应该是对stata新生成的中间变量的解读。4.4均衡性检验结果4.5匹配结果的图示化5.Stata命令汇总最后留下两个问题给大家思考:题目 试验设计中,匹配的目的在于确保干预效应估计是建立在可比个体之间的不同结果的基础上。最简单的匹配方式是将干预组和对照组中协变量值相同的两个个

平平淡淡,戒急用忍,一生学闭嘴。 5万+

网络编程/类加载器/

一:网络编程 1:三要素 1:Ip 2:InetAddress类 InetAddress:此类表示Internet协议(IP)地址 相关方法 方法名 说明 static InetAddress getByName(String host) 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址 String getHostName() 获取此IP地址的主机名 String getHostAddress() ...

weixin_59449833的博客 245

模拟IC设计笔记:拆解一个经典的时钟占空比校正(DCC)电路模块,从理论到SPICE仿真

本文深入解析了时钟占空比校正(DCC)电路在模拟IC设计中的关键作用,特别是在高速ADC应用中。通过晶体管级拆解,详细介绍了基于电荷泵和积分器的模拟反馈型DCC电路设计,包括占空比检测、误差放大与校正执行单元的实现。文章还提供了SPICE仿真验证方法,确保电路在100MHz时钟下的稳定性和性能。

weixin_33725722的博客 428

Java虚拟机:深入详细分析Java ClassLoader原理与源码

一、什么是ClassLoader? ClassLoader就是类加载器,当我们写好一个Java程序之后,都是由若干个.class文件组成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,...

张维鹏的博客 5100

STM32输入捕获功能,同时捕获8路波形。

STM32输入捕获功能,使用TIM2和TIM3同时捕获8路波形。 工作上的一个需求,要采集两组控制步进电机的信号。就是采集8个通道的方波,测量频率和计脉冲个数。看起来简简单单的东西,磕磕碰碰搞了两天,走了一些弯路,这里写出来记录一下。顺便理解一下输入捕获个多种用法。 1. 硬件设计 首先看一下用到那些IO口。在STM32手册里找这样TIMx_CHx的就是输入捕获的口了。 这里用了TIM2的4个口和TIM3的4个口。 定义 端口 TIM2_CH1 PA0 TIM2_CH2 PA1 TI

qq_36353009的博客 5123

【Autoware】2小时安装Autoware1.13(保姆级教程)

Autoware是一款“一体化”开源自动驾驶软件,能实现感知、决策、控制等功能,通过在Ubuntu中搭建Autoware开发环境和案例的运行,使大家对自动驾驶技术的实现有一个更清晰的认识。

DevFrank的博客 1万+

Java虚拟机(六):类加载器ClassLoader

“通过一个类的全限定名来获取描述此类的二进制流”这个动作放到虚拟机外部去实现,以便让应用程序决定如何去获取所需要的类。这个动作模块就是类加载器。而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以C

Luckydog1991的博客 963

OpenClaw小白使用全攻略

OpenClaw全能技能解锁指南:从基础到进阶 摘要: 本文提供OpenClaw AI智能体的完整使用教程,帮助用户从安装后"不知道如何用"到熟练掌握核心功能。教程包含:1)控制台5大区域详解和3个必做初始化设置;2)文件管理、浏览器自动化、文档生成等5大基础功能实操,每个功能配有详细操作步骤、指令模板和效果演示;3)10+高频场景解决方案,如整理文件、搜集资料、写总结等;4)进阶技巧和常见问题解答。通过清晰的图文指引,即使电脑小白也能快速上手,实现办公自动化、提升工作效率。

通俗易懂学IT 3059

最新深入理解Java类加载器(一):Java类加载原理解析之网络加载器(4),泪目

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

2401_84557750的博客 938

2026年数字IC设计华为笔试带答案解析

这篇文章是一份数字IC设计工程师笔试的试卷结构和部分题目解析。试卷包含单选题31题(每题2分)、多选题10题(每题4分)和简答/编程题4题(每题7分),总分130分,考试时长120分钟。 摘要重点: 试卷涵盖数字IC设计的关键知识点,包括Verilog语法、时序逻辑、状态机设计、跨时钟域处理等; 题目解析详细说明了各选项的正确性,如非阻塞赋值特性(D错误)、功耗影响因素(C与组合逻辑级数弱相关)等; 包含实际工程问题,如DDR4接口电平(SSTL-1.2)、卡诺图变量排序(格雷码)等; 部分题目考察基础概念

Open 369

10、边缘智能学习技术解析

本文深入解析了边缘智能学习技术的四大核心方法:联邦学习、DNN拆分、迁移学习和八卦学习。文章从人类大脑的学习机制出发,引出边缘级智能的重要性,并详细阐述各类技术的架构、优势、挑战及适用场景。通过对比分析,展示了不同技术在隐私性、效率、可扩展性等方面的特性,并探讨了未来融合多种技术、软硬件协同优化及应用领域拓展的发展趋势,为边缘智能在物联网与人工智能领域的应用提供了系统性参考。

ppp33的博客 117

2024年最新深入理解Java类加载器(一):Java类加载原理解析之网络加载器(5),linux驱动开发面试

至此,文章终于到了尾声。技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;项目经历:只写明星项目,描述遵循 STAR 法则;简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取本文已被。

2401_84692382的博客 469

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Java 基础篇】Java类加载器详解

Java允许开发人员自定义类加载器,以满足特定的加载需求。自定义类加载器必须继承类,并重写findClass方法。在findClass方法中,开发人员可以根据自己的规则和逻辑来加载类的字节码。// 根据名称加载类的字节码 byte [ ] byteCode = loadClassByteCode(name);// 调用defineClass方法将字节码转换为Class对象 return defineClass(name , byteCode , 0 , byteCode . length);

繁依Fanyi的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深入理解Java类加载器(一):Java类加载原理解析

每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制。本文简述了JVM三种预定义类加载器,即启动类加载器、扩展类加载器和系统类加载器,并介绍和分析它们之间的关系和类加载所采用的双亲委派机制,给出并分析了与Java类加载原理相关的若干问题。

Rico's Blogs 6万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【深入理解JVM】:类加载器与双亲委派模型

类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因。在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字节流,完成这个动作的代码块就是类加载器。这一动作是放在Java虚拟机外部去实现的,以便让应用程序自己决定如何获取所需的类。 虚拟机规范并没有指明二进制字节流要从一个Class文件获取,或者说

smile4lee的博客 7万+

Java类加载器:深入理解与应用

除了Java自带的类加载器,开发者还可以通过继承类并重写findClass方法来创建自定义类加载器。自定义类加载器可以用于实现特定的类加载逻辑,比如从数据库、网络或其他非标准位置加载类。@Override// 实现从文件系统加载类文件的逻辑// 这里只是一个示例,具体实现需要根据实际情况来编写自定义类加载器在Java应用中扮演着重要角色,尤其是在需要动态加载类、实现模块化、插件化或者需要从非标准源加载类的场景中。在这一节中,我们将深入了解自定义类加载器的概念、实现方式以及一些实际应用示例。

无远弗届 1229

深入理解(3)Java类加载器(ClassLoader)

原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461 类加载的机制的层次结构 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.cl...

cowbin2012的专栏 1万+

Java类加载器的使用

类加载器可以做什么

eck_燃的博客 2681

深入理解Tomcat类加载器原理

Tomcat类加载器体系通过多级加载器、部分委派和自定义实现,兼顾了应用隔离性、扩展性和热部署能力。理解其设计思想与源码实现,有助于高效排查类加载相关问题、优化应用架构,并为微服务、插件化等高阶场景打下坚实基础。知其然,更知其所以然,才能在实际开发中游刃有余,构建高可用、可维护的Java Web应用。速记口诀汇总委派流程:“先问爹,爹不会,才自己来。加载流程:“查缓存,问父亲,自己找,链接用。如有疑问,欢迎留言讨论!

IT技术学习与工作笔记分享 2201

深入理解 Java 类加载器:双亲委派机制源码解析

简介: 本文深入解析Java类加载器与双亲委派机制,从Bootstrap到自定义加载器,剖析loadClass源码,揭示类加载的线程安全、缓存机制与委派逻辑,并探讨SPI、Tomcat、OSGi等场景下打破双亲委派的原理与实践价值

三两肉的博客 1239
上一篇: SpringMVC学习中遇到的问题
下一篇: 深入理解Java类加载器(一):Java类加载原理解析
给自己加加油
博客等级 码龄8年 302粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值