Thread.currentThread().getContextClassLoader()

Java安全——JVM类加载器 Java类加载机制在Java安全知识体系中有着非常重要的地位,早在之前分析Shiro反序列化漏洞利用,以及学习蚁剑Java马,都和Java ClassLoader打过交道。笔者打算从把ClassLoader的原理、使用场景、自定义方式等多个方面剖析类加载器在Java安全中设计到的知识。 0x01 ClassLoader 简介 Java语言需要把代码编译成class文件,才能用JVM加载执行,那么ClassLoader就是负责将class文件加载到内存,生成对应的类。 0x1 ClassLoader.. 阅读详情

Thread线程API中,getContextClassLoader()方法的描述为:

* Returns the context ClassLoader for this Thread. The context
* ClassLoader is provided by the creator of the thread for use
* by code running in this thread when loading classes and resources.
* If not {@linkplain #setContextClassLoader set}, the default is the
* ClassLoader context of the parent Thread. The context ClassLoader of the
* primordial thread is typically set to the class loader used to load the
* application.
*
* <p>If a security manager is present, and the invoker's class loader is not
* {@code null} and is not the same as or an ancestor of the context class
* loader, then this method invokes the security manager's {@link
* SecurityManager#checkPermission(java.security.Permission) checkPermission}
* method with a {@link RuntimePermission RuntimePermission}{@code
* ("getClassLoader")} permission to verify that retrieval of the context
* class loader is permitted.

翻译成中文大概意思为:

返回该线程的ClassLoader上下文。线程创建者提供ClassLoader上下文,以便运行在该线程的代码在加载类和资源时使用。如果没有,则默认返回父线程的ClassLoader上下文。原始线程的上下文 ClassLoader 通常设定为用于加载应用程序的类加载器。

首先,如果有安全管理器,并且调用者的类加载器不是 null,也不同于其上下文类加载器正在被请求的线程上下文类加载器的祖先,则通过 RuntimePermission("getClassLoader") 权限调用该安全管理器的 checkPermission 方法,查看是否可以获取上下文 ClassLoader。

下面的例子说明子线程的ClassLoader与父线程的一致:

public class Test {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getId()+"-outer:"+Thread.currentThread().getContextClassLoader());
        new Thread(){
            public void run(){
                System.out.println(Thread.currentThread().getId()+"-inner:"+Thread.currentThread().getContextClassLoader());
            }
        }.start();
        new Thread(){
            public void run(){
                System.out.println(Thread.currentThread().getId()+"-inner:"+Thread.currentThread().getContextClassLoader());
            }
        }.start();
    }
}

 返回值:

1-outer:sun.misc.Launcher$AppClassLoader@18b4aac2
12-inner:sun.misc.Launcher$AppClassLoader@18b4aac2
13-inner:sun.misc.Launcher$AppClassLoader@18b4aac2

以上结果表示返回的ClassLoader是一样的。

 

应用:

在阅读org.apache.commons.beanutils.BeanUtils#copyProperties源码时,发现里面用到了类org.apache.commons.beanutils.ContextClassLoaderLocal,该类中的map让ClassLoader作为key,通过以上的描述,在一个JVM程序中,得到的ClassLoader是一个,所以可以作为一个全局的key存在。

加载、读取资源的方式 ❀ 通过类加载器进行加载,通过流的方式进行读取,从而获取资源 1、java的jdk内置的加载方式: 通过线程Thread(lang包的)获取到类加载,然后以流的方式获取资源: InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"); /* 【使用输入流inputStream】 */ private static Properties 阅读详情

相关推荐

(一篇即成功)Ubuntu下搭建qt环境和安装Qt Creator

只需一篇就成功搭建Ubuntu下的QT环境 你还在等什么

m0_73450461的博客 1万+

Thread.currentThread().getContextClassLoader().getResourceAsStream

打个简单的比方,你一个WEB程序,发布到Tomcat里面运行。首先是执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器是ClassLoader.getSystemClassLoader()。而我们后面的WEB程序,里面的jar、resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar、资源文件的时候,首先应该是使用...

liudongdong_jlu 1万+

深入解析π型滤波电路:RC与LC滤波器的实战选型指南

本文深入解析了π型滤波电路的工作原理与实战选型。重点对比了RC型与LC型滤波器的核心差异:RC型成本低、体积小,但存在压降与能耗,适用于小电流场景;LC型效率高、滤波性能好,但成本与体积较大,适合中到大电流及高纹波抑制需求。文章提供了基于不同应用场景的选型指南与设计要点,帮助工程师做出精准决策。

weixin_29291069的博客 651

ClassLoader,Thread.currentThread().setContextClassLoader,tomcat的ClassLoader

实际上,在Java应用中所有程序都运行在线程里,如果在程序中没有手工设置过ClassLoader,对于一般的java类如下两种方法获得的ClassLoader通常都是同一个  this.getClass.getClassLoader(); Thread.currentThread().getContextClassLoader(); 方法一得到的Classloader是静态的...

weixin_34400525的博客 464

双向全桥隔离DC-DC变换器(DAB)的调制优化与挑战解析

本文深入解析了双向全桥隔离DC-DC变换器(DAB)的核心调制技术及其面临的挑战。文章从基础的相移调制(SPS)入手,逐步探讨了扩展相移(EPS)、双重相移(DPS)等进阶策略,并重点分析了电流优化与零电压开通(ZVS)等硬核优化技巧。针对DAB在实际应用中存在的建模困难、多模块并联及数字实现等挑战,提供了实用的应对策略与设计思路,旨在帮助工程师在性能、复杂度与成本之间找到最佳平衡。

weixin_29271053的博客 569

Marin说PCB之LPDDR5的布线注意事项--03

这个规则中是把每个字节中的WCK to RDQS 以及DM / DQ to WCK等长规则都加到了DM / DQ这个等长规则中去了,因为芯片手册上的设计要求中的DM / DQ这个group的等长误差是+-50MIL, WCK to RDQS的等长group的规则是62.5MIL,DM / DQ to WCK等长group的规则是相对松一些是150MIL。其实上面的等长规则还是建少了一些的,例如手册上要求的每个channel的WCK0:1,WCK2:3等长误差在+-488MIL,这个规则建议还是补上去吧。

weixin_45223454的博客 1227

ContextClassLoader介绍

Thread.currentThread().getContextClassLoader()的意义: 1,父Classloader可以使用当前线程Thread.currentthread().getContextLoader()中指定的classloader中加载的类。颠覆了父ClassLoader不能使用子Classloader或者是其它没有直接父子关系的Classloader中加载的类这

每天积累一点,一年后你会发现,自己变化很大 1580

092、多sensor帧同步在环视系统中的实现——基于瑞芯微RK3588的PPS同步与曝光同步方案

摘要: 本文探讨了瑞芯微RK3588平台在360环视系统中实现多摄像头帧同步的技术方案。针对环视拼接常见的动态场景错位问题,提出了PPS同步与曝光同步相结合的解决方案。通过GPIO硬件触发实现四路摄像头同步曝光,配合I2C全局曝光控制,将时间误差控制在0.5ms内。文章详细解析了RK3588设备树配置、内核驱动实现中的关键细节,包括同步信号处理、寄存器原子写入等核心技术点,并分享了量产中遇到的温度漂移、信号完整性等实际问题及解决方法。最终通过硬件整形和电源优化,将同步抖动控制在±5μs以内,有效解决了动态拼

zzfmlxs的博客 32

Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别 查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 忘记以前有没有问过这个问题,总之我现在有看到几个地方有这个:Thread.currentThread().getContextClassLoader()我总是想不出在什么情...

weixin_30897079的博客 256

基于深度学习的图像修复系统,GAN图像修复,图像修复算法研究,并实现系统登录和注册,全网独发

近年来,深度学习已成为计算机视觉领域的研究热点,基于深度学习的图像修复技术弥补了传统修复方法长期存在的不足,显著提高了生成结果的质量。深度学习是指模仿人脑机制设计的具有深层结构的神经网络。深度学习作为一种表征学习,通过模仿人脑神经元之间的信息传递方式来学习输入数据的特征,并找到输入和输出数据之间的映射关系。通过在图像修复中应用深度学习技术,可以准确学习图像的语义信息,然后根据信息预测缺失的内容,大大克服了传统修复算法的不足,使结果更具逻辑性。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 8248

RK3568平台开发系列:Android环境下CAN的使用

在RK3568平台上,我们可以利用Android环境中的API来实现CAN的使用。通过以上步骤,我们可以在Android应用中发送和接收CAN数据,并进行相应的处理。当接收到CAN数据时,将触发onMessageReceived回调方法,我们可以在这个方法中对接收到的数据进行处理。在上述代码中,我们指定了CAN的ID为0x123,数据为{0x01, 0x02, 0x03},并设置了标志位和周期。接收CAN数据需要注册一个监听器,并在监听器中处理接收到的数据。发送CAN数据需要指定CAN的ID和数据。

2301_79330513的博客 1911

关于ClassLoader.getSystemClassLoader()和Thread.currentThread().getContextClassLoader()

今天碰到一个问题,我做了一个动态编译的程序,但在javaSE环境直接运行(即javaApplication状态)可以运行,但在tomcat服务器上通过请求来处理就不行,提示找不到我动态生成的类:关键语句如下(报错时我写的是:return ClassLoader.getSystemClassLoader())最后我发现写成如图这样,调用Thread.currentThread().getContex...

xcxy2015的博客 1万+

【异常】CNB提示The bill authorization scope cannot access the current request.

摘要:CNB API返回403错误,表明当前token的授权范围无法访问目标仓库。主要原因是:1) REPO_SLUG填写错误,导致资源地址不匹配;2) CNB_TOKEN未授权目标仓库;3) 账号账单状态异常。解决步骤:先检查REPO_SLUG是否与CNB平台仓库地址完全一致;再确认CNB_TOKEN是否绑定目标仓库且有读取权限;最后检查账号账单是否正常且覆盖目标资源。完成排查后更新配置即可解决此授权问题。

奶爸的编程之路,也就一周冷个三天 663

Thread.currentThread().getContextClassLoader().getResourceAsStream()无法读取配置文件的记录

2021.3.28 问题描述 今天在学习尚硅谷小项目的时候看到老师写的代码中用到了 JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"); 这样一段代码,目的是为了加载jdbc.properties这个配置文件,但是我发现我自己使用的时候是空指针异常。非常莫名其妙。 于是乎,在网上找了一堆资料,发现很多人都在文章中推荐使用 Thread.currentThread().getContextClassLoader().

安洁莉娅丶的博客 7579

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Thread.currentThread().getContextClassLoader()andClass.getClassLoader()区别

What is different between Thread.currentThread().getContextClassLoader() and Class.getClassLoader()? From API document, the Thread.currentThread().getContextClassLoader() returns the context Clas

凤歌 1334

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Thread.currentThread().getContextClassLoader()与Test.class.getClassLoader()区别

忘记以前有没有问过这个问题,总之我现在有看到几个地方有这个: Thread.currentThread().getContextClassLoader() 我总是想不出在什么情况下会用这种方式获得一个ClassLoader,因为好像默认情况下,它返回的是和加载应用的ClassLoader是同一个,比如说在一个类Test中写 ClassLoader cl = Thread.currentThr

逝者如风 1335

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

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

区别:Thread.currentThread().getContextClassLoader() and Class.getClassLoader()

What is different between Thread.currentThread().getContextClassLoader() and Class.getClassLoader()? From API document, the Thread.currentThread().getContextClassLoader() returns the context ClassL

skiof007的专栏 1527

代码中动态加载jar、资源文件等--Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

https://www.cnblogs.com/gaoxing/p/4703412.html Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别 查了一些资料也不是太明白两个的区别,但是前者是最安全的用法   打个简单的比方,你一个WEB程序,发布到Tomcat里面运行。 首先是执行Tomcat...

qq_40976357的博客 781

Thread.currentThread().getContextClassLoader().loadClass(className)

编译器加载类要依靠classloader, 而classloader有3个级别,从高到低分别是BootClassLoader(名字可能不准确) , ExtClassLoader, AppClassLoader.这3个加载器分别对应着编译器去寻找类文件的优先级别和不同的路径:BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方ExtClassLoader对...

kanwoerzi 992

Thread.currentThread().getContextClassLoader()和Class.getClassLoader()区别

面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>> What is different between Thread.currentThread().getContextClassLoader() and Class.getClassLoader()? From API document, the Thread.currentThread().getConte...

深耕技术 453
上一篇: java代码编写logback配置
下一篇: 总结对象属性拷贝的方法及效率比较(一)
SJZYLC
博客等级 码龄12年 192粉丝 96原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值