classLoader原理及自定义ClassLoader

类加载-自定义类加载器 3.2.4. 自定义类加载器ClassLoader 3.2.4.1. 自定义类加载器介绍 1)自定义类加载器的作用 a.安全。避免核心类库被随意篡改。此外,Bootstrap、Extension、Application类加载器只能加载指定路径下的类字节码,如果想要加载某些特定位置的类文件或者加载网络上的某个类文件时上述三种类加载器就不适用了,需要使用自定义的类加载器。 b.加密。java字节码很容易被反编译,通过定制ClassLoader使得字节码先加密防止别人下载后反编译,这里的ClassLoader相当 阅读详情

ClassLoader功能

类的加载

JVM运行的时候,当用到一个类的时候,需要把类字节码文件加载到内存并生成运行时数据结构,其中classLoader的角色必不可少
classLoader加载一个类的时候,会调用其如下方法

public Class<?> loadClass(String name) throws ClassNotFoundException {
    return loadClass(name, false);
}
双新委派机制

其中调用的方法

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{
...
            Class<?> c = findLoadedClass(name);
            if (c == null) {
...
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
...
                if (c == null) {
...
                    c = findClass(name);
...
                }
            }
...
            return c;
}

就是classLoader的双新委派机制,它是可以被子类重写的,当自定义的classLoader的重写这个方法可以打破双新委派的机制

protected Class<?> findClass(String name) throws ClassNotFoundException {
    throw new ClassNotFoundException(name);
}

此方法需要具体的classLoader来实现

字节码与类的注册

findClass的实现里面经常会用到如下方法

protected final Class<?> defineClass(String name, byte[] b, int off, int len)throws ClassFormatError{
    return defineClass(name, b, off, len, null);
}
protected final Class<?> defineClass(String name, byte[] b, int off, int len,ProtectionDomain protectionDomain)throws ClassFormatError{
    protectionDomain = preDefineClass(name, protectionDomain);
    String source = defineClassSourceLocation(protectionDomain);
    Class<?> c = defineClass1(name, b, off, len, protectionDomain, source);
    postDefineClass(c, protectionDomain);
    return c;
}
private native Class<?> defineClass1(String name, byte[] b, int off, int len, ProtectionDomain pd, String source);

最终是通过native的defineClass1来实现字节码加载到内存结构中去的

资源加载

程序中还经常使用classLoader来获取资源

public InputStream getResourceAsStream(String name) {
    URL url = getResource(name);
    try {
        return url != null ? url.openStream() : null;
    } catch (IOException e) {
        return null;
    }
}
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;
}
protected URL findResource(String name) {
    return nu
5个免费股票数据API实测对比:从AkShare到BaoStock,哪个最适合你的AI量化项目? 本文深度评测了AkShare、BaoStock、yfinance、Alpha Vantage和EOD Historical Data这五个免费股票数据API,从数据质量、覆盖范围、更新频率、稳定性及易用性进行对比。针对AI量化项目,文章提供了详细的选型策略,帮助开发者根据项目阶段与需求,精准选择最适合的数据源,并强调了多源验证与数据清洗的重要性。 阅读详情

相关推荐

Qt软件开发: 开发MQTT客户端软件,模拟硬件登录各大主流MQTT平台完成通信

此软件是使用QT编写MQTT客户端(根据mqtt官方文档3.1.1,自己实现过程代码,没有使用其他库,稳定,方便移植),模拟硬件登录各大主流的MQTT物联网服务器,完成主题订阅、发布等操作,实现数据通信交互。 已经测试OneNET、阿里云IOT、华为云IOT、百度IOT、电信IOT、原子云IOT等等常用的物联网云平台,都可以正常实现数据通信,只要云平台支持标准MQTT协议都可以使用此软件进行登录测试。 特别是大家没有硬件,想测试与MQTT物联网云服务器通信的,此软件是非常的方便。使用简单,比官方的软件操作

1万+

(JVM)为什么要自定义ClassLoader类加载器?

(jvm)为什么要自定义ClassLoader类加载器?

QRLYLETITBE的博客 640

自定义classloader的使用

自定义classloader的使用

为什么要自定义ClassLoader进行类加载

假如,你开发的java程序都需要从E:\classloader1目录下的类文件中加载class,而不是系统指定的系统目录或者classpath目录下加载,则如何解决? 需要自定义classloaderClassLoader:加载各种class文件到JVM中。ClassLoader是抽象类。 类的加载过程分为加载阶段、连接阶段、初始化。 加载阶段:寻找class文件。 连接阶段:验证class...

weixin_33697898的博客 1183

自定义ClassLoader

自定义ClassLoader为什么要自定义ClassLoaderClassLoader类动手实现MyClassLoader在D:/tmp 文件夹下编写TClass.java并编译测试 为什么要自定义ClassLoader        java的系统提供了3种类加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extends...

C_hello_world_的博客 358

实现一个自定义类加载器:深入理解`loadClass`与`findClass`

类加载器(ClassLoader)是Java虚拟机(JVM)的一部分,它负责将类的字节码加载到JVM的内存中。在JVM中,类是通过类加载器动态加载的,类加载器将字节码文件转换成内存中的类对象。加载(Loading):通过类加载器将类的字节码读入内存,并生成对应的Class对象。连接(Linking):包括验证、准备和解析,确保类的正确性。初始化(Initialization):对类的静态变量和静态代码块进行初始化。类加载器负责加载阶段,它将外部的字节码文件转换为 JVM 能够执行的Class对象。

lssffy的博客 2031

Java之自定义类加载器

0. 为什么需要自定义类加载器 网上的大部分自定义类加载器文章,几乎都是贴一段实现代码,然后分析一两句自定义ClassLoader原理。但是我觉得首先得把为什么需要自定义加载器这个问题搞清楚,因为如果不明白它的作用的情况下,还要去学习它显然是很让人困惑的。 首先介绍自定义类的应用场景: (1)加密:Java代码可以轻易的被反编译,如果你需要把自己的代码进行加密以防止反编译,可以先将编译后的代码用...

weixin_41438466的博客 433

C/C++经典算法——约瑟夫问题

C/C++经典算法——约瑟夫问题 什么是约瑟夫问题 一行代码解决约瑟夫问题!!!

青春无问西东 岁月自成芳华 12万+

C语言编程常见问题分析,以及错误解决办法!

编程不经历错误或警告,怎能见彩虹,没有人能随随便便成为高手。 身为程序员的我们,如果哪一天没有了错误或警告的提示,一定会有一种不祥的预感,对吧,都懂的。 编程N年来,碰到过的问题多得自己都记不清了,你也一样,如果可以选择,我愿时光倒流,真希望都能记下来,现在就可以写本《错误集》了。 在遇到错误的时候不要慌,首先看报错,中文直接看,英文翻译...

HUYA69的博客 5160

el-tree懒加载遇到的问题 —— 默认选中前几个节点,父节点以及所有子节点也被选中

前言:el-tree使用懒加载方式(由于数据量大)设置默认选中的是父节点的前两个子节点,展开时,发现父节点和所有子节点全选中了,于是打了一下debugger,发现点击展开时,默认走选中的前两个子节点,到第二个节点是时走了reInitChecked父节点的checked属性变成了true,因为父节点变成了true,所以他又将所有子节点都变成了true(莫名其妙子节点还没渲染完就重置了父节点的状态);然后我尝试了一下默认选中节点设置父节点的第一个和第三个节点,发现没有问题呢!??? 首先我是使用懒加载的方式加

monparadis的博客 2892

matlab错误dparsfa,请教DPARSFA的问题

老师们,你们好!我在用DPASFA处理数据时,matlab里提示了下面的错误,请问是什么原因?怎么解决?谢谢!??? Index exceeds matrix dimensions.Error in ==> DPARSFA_run at 165InputFilename=[AutoDataProcessParameter.DataProcessDir,filesep,'T1Raw',file...

weixin_31054839的博客 555

自定义classloader并实现热部署-使用loadClass

需求如下: 可在前端新增、修改java代码,并可实现服务不重启的前提下进行代码的部署运行。 相当于:可实现java代码的热部署。 代码如下: ClassLoaderTest: 自定义classloader测试类 ClazzCache: 自定义ClassLoader缓存类 CustomCompiler: 自定义编译器 CustomClassLoader: 自定义ClassLoader CustomClassLoaderParam: 自定义ClassLoader包装类(不要直接使用此类中的方法,应.

小安灬的博客 1117

SpringBoot自动配置

SpringBoot自动配置

懒起来 487

自定义类加载器(自定义类加载器的作用)

设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现?在java中,我们的类都是通过ClassLoader来加载的,同时ClassLoader具有层级关系,当某个类找不到时,它会去他的父类加载器去寻找,如果依然找不到,就抛出ClassNotFoundException了。为了动态加载hello.jar里面的Util类,我们需要将这个jar包放入到我们的类加载器中去,然后再获取里面的类。

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 2085

springboot启动bean加载处理器ConfigurationClassPostProcessor 三(@Import注解)

@import导入的方式有哪几种? 什么是DeferredImportSelector?具体的处理的流程又是怎样?

jiaxiaoyan321的博客 403

自定义ClassLoader

自定义ClassLoader

阿昊的博客 2431

Java自定义ClassLoader加载外部类

前几天在GitHub上下载了一个开源项目想要运行起来,启动这个项目会关联到数据库的一些表。因此想要运行起来还需要把数据库表建好。但是这个项目涉及到几十张表,并且作者没有给建表的SQL语句。(后续:吐血中,作者在项目给了sql语句。。。。。)想用这个项目那就只好自己建表了,但是几十张表自己建一时半会儿也弄不好。有这时间还不如重新找一个新项目于是果断放弃了这个项目,结果找了一圈发现这种类型的开源Java项目还真是少。于是,没办法还是回到这个项目。

Myd 1984

自定义类加载器加载冲突类()-URLClassLoader

描述 之前直接继承ClassLoader, 单独加载类,且有依赖的时候会比较麻烦。 此处使用URLClassLoaderClassLoader的子类SecureClassLoader的子类)加载整个lib,并调用其中的方法 代码 package com.hz.classloader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.lang.reflec

pp_lan的博客 1230

Java ClassLoader 03 -- URLClassLoader 动态加载

Java ClassLoader 03 -- URLClassLoader 动态加载 自定义类加载器,打破双亲委派模式

fengxianaa的博客 3560

pb图片透明,文本透明

利用api使用单色文图及文本的透明。与普通透明文本实现效果更理想,可对图片,文本,数据窗口等对象实现透明。值得研究!

上一篇: asm代码解析看java字节码结构
下一篇: ASM静态代码解析方法依赖及生成方法调用流程图方法
hanlang_java
博客等级 码龄11年 9粉丝 19原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值