Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >怎么打印当前ClassLoader 加载了哪些Jar

怎么打印当前ClassLoader 加载了哪些Jar

作者头像
共饮一杯无
发布于 2022-11-28 08:27:30
发布于 2022-11-28 08:27:30
61500
代码可运行
举报
运行总次数:0
代码可运行

具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
        URL[] urLs = Launcher.getBootstrapClassPath().getURLs();
        System.out.println("启动类加载器加载的jar:");
        for (URL urL : urLs) {
            System.out.println("==> " + urL.toExternalForm());
        }
        printClassLoader("扩展类加载器和其加载的jar:",ClassLoaderJarPrint.class.getClassLoader().getParent());
        printClassLoader("应用类加载器和其加载的jar:",ClassLoaderJarPrint.class.getClassLoader());
    }

    public static void printClassLoader(String name, ClassLoader CL) {
        if (CL != null) {
            System.out.println(name + " ClassLoader -> " + CL.toString());
            printURLForClassLoader(CL);
        } else {
            System.out.println(name + " ClassLoader -> null");
        }
    }

    public static void printURLForClassLoader(ClassLoader CL) {
        Object ucp = insightField(CL, "ucp");
        Object path = insightField(ucp, "path");
        ArrayList ps = (ArrayList) path;
        for (Object p : ps) {
            System.out.println(" -=>" + p.toString());
        }
    }

    private static Object insightField(Object obj, String fName) {
        try {
            Field f = null;
            if (obj instanceof URLClassLoader) {
                f = URLClassLoader.class.getDeclaredField(fName);
            } else {
                f = obj.getClass().getDeclaredField(fName);
            }
            f.setAccessible(true);
            return f.get(obj);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

输出如下:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM | 基于类加载的一次完全实践
我在上篇文章:JVM | 类加载是怎么工作的 中为你介绍了Java的类加载器及其工作原理。我们简单回顾下:我用一个易于理解的类比带你逐步理解了类加载的流程和主要角色:引导类加载器,扩展类加载器和应用类加载器。并带你深入了解了这些“建筑工人”如何从底层工作,搬运原材料(类)并将其完整地构建在Java虚拟机(JVM)的“建筑工地”上。然后,我们跟随一个具体的Building类,亲眼目睹了其在JVM中的生命周期。我在文章末尾留了几个问题,你还记得吗?
kfaino
2023/09/30
6800
JVM | 基于类加载的一次完全实践
深入理解Java类加载器(ClassLoader)
本篇博文主要是探讨类加载器,同时在本篇中列举的源码都基于Java8版本,不同的版本可能有些许差异。主要内容如下
用户1257215
2018/10/26
1.7K0
JAVA虚拟机系列三-类加载过程、双亲委派模型、对象实例化过程
类加载过程就是将.class文件转化为Class对象,类实例化的过程,(User user = new User(); 这个过程是对象实例化的过程);
架构之家
2022/07/12
3380
JAVA虚拟机系列三-类加载过程、双亲委派模型、对象实例化过程
类加载器ClassLoader
上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是将编译过后的Class文件加载到内存中。
Liusy
2020/09/01
7720
类加载器ClassLoader
ClassLoader解惑
一个Java程序要想运行起来,首先需要经过编译生成 .class文件,然后创建一个运行环境(jvm)来加载字节码文件到内存运行,而.class 文件是怎样被加载中jvm 中的就是Java Classloader所做的事情。
加多
2018/09/06
1.4K0
ClassLoader解惑
jvm之java类加载机制和类加载器(ClassLoader)的详解
识别方式:ClassLoader instance id + PackageName + ClassName 验证方式:使用类加载器,对同一个class类的不同版本,进行多次加载,检查是否加载到最新的代码。
IT架构圈
2021/02/01
1.6K0
jvm之java类加载机制和类加载器(ClassLoader)的详解
JVM篇2:[-加载器ClassLoader-]
深入理解Java类加载器(ClassLoader) Java --ClassLoader创建、加载class、卸载class 关于Class实例在堆中还是方法区中?
张风捷特烈
2024/02/11
1430
JVM篇2:[-加载器ClassLoader-]
Java ClassLoader 透析
ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上的文章也是一篇又一篇,经过本人的亲自鉴定,绝大部分内容都是在误导别人。本文我带读者彻底吃透 ClassLoader,以后其它的相关文章你们可以不必再细看了
码脑
2019/04/11
5290
Java ClassLoader 透析
类加载器之URLClassLoader
通过源码我们可以发现AppClassLoader和ExtClassLoader都是Launcher的静态内部类,继承自URLClassLoader。
每天学Java
2020/08/05
5.9K0
Java虚拟机--类加载器源码
类加载器源码分析 下面,我们就来深入的学习下类加载器的源码,看看到底做了哪些事情? 类加载体系 上图呈现是源码级别的类加载体系,ClassLoader是基类,所有的类加载器都需要继承它(启动类加载器除
贾博岩
2018/06/20
8310
ClassLoader解析(一):Java中的ClassLoader
Step1::自定义类加载器首先从缓存中查找Class是否已经加载,如果已将加载就返回该Class;如果没加载,则委托给父加载器也就是App ClassLoader。
用户1205080
2019/01/23
6080
2.双亲委派机制详细解析及原理
研究类加载的过程就是要知道类加载的时候使用了双亲委派机制。但仅仅知道双亲委派机制不是目的,目的是要了解为什么要使用双亲委派机制,他的原理是什么?知道双亲委派机制的逻辑思想,然后这个思想是否可以被我们借鉴,为我所用。这才是学习知识的目的。
用户7798898
2021/10/09
7140
踩坑集锦之你真的明白Java类路径的含义吗?
在Dubbo源码篇02—从泛化调用探究Wrapper机制的原理一文中,我们写过compileJava2Class这个方法,来编译,加载,实例化我们的代理对象的java文件:
大忽悠爱学习
2023/05/23
1.4K0
踩坑集锦之你真的明白Java类路径的含义吗?
JVM-白话聊一聊JVM类加载和双亲委派机制源码解析
其中最核心的方法 loadClass ,其实现我们常说的双亲委派机制 ,我们后面展开。
小小工匠
2021/08/17
2800
Java中常见的类加载器及双亲委派机制的原理
我们在代码里得到类的一个class对象,然后通过它的getClassLoader方法得到一个ClassLoader对象,那么运行一下看看这个ClassLoader对象的名字是什么
全栈程序员站长
2022/07/25
2330
Java中常见的类加载器及双亲委派机制的原理
Java 类机制(2)---- 类加载过程
大家好,在该专栏的上一篇文章中我们介绍了一下关于 Java 中类的相关知识点。那么这篇文章我们来看一下一个 Java 类是怎么被虚拟机加载并使用的,本文内容参考了《深入理解Java机》一书。
指点
2019/06/14
6600
Java 类机制(2)---- 类加载过程
从源码角度学习JVM类加载器及自定义类加载器
负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,这个加载器是由C++写的,所以我们在java源码里面是找不到它的实现,如果尝试对它进行打印,输出将为空值。
AI码师
2022/12/22
4090
从源码角度学习JVM类加载器及自定义类加载器
一看你就懂,超详细java中的ClassLoader详解
ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。想想也是的,一次性加载那么多jar包那么多class,那内存不崩溃。本文的目的也是学习ClassLoader这种加载机制。
Frank909
2019/01/14
5.5K1
深入浅出 ClassLoader
“加载”是类加载的时机的第一阶段。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括(5个阶段): ① 加载(Loading) ② 连接(Linking)      [1] 验证(Verification)      [2] 准备(Preparation)      [3] 解析(Resolution) ③ 初始化(Initialization) ④ 使用(Using) ⑤ 卸载(Unloading)
tomas家的小拨浪鼓
2019/08/06
8190
深入浅出 ClassLoader
深入分析Java ClassLoader原理
大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则会引发系统异常。而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。
哲洛不闹
2018/09/19
7430
深入分析Java ClassLoader原理
相关推荐
JVM | 基于类加载的一次完全实践
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验