【读码JDK】-java.lang.ClassLoader类Api介绍及测试

简介: jdk11与jdk8 之间类加载器的区别知道吗?

在这里插入图片描述
【读码JDK】java.lang包目录

几种类加载器

  1. Bootstrap ClassLoader

负责加载JDK自带的rt.jar包中的类文件,它是所有类加载器的父加载器,Bootstrap ClassLoader没有任何父类加载器。

  1. Extension ClassLoader(Platform ClassLoader)负责加载Java的扩展类库,也就是从jre/lib/ext目录下或者java.ext.dirs系统属性指定的目录下加载类。
  2. System ClassLoader(App ClassLoader)负责从classpath环境变量中加载类文件,classpath环境变量通常由"-classpath" 或 "-cp" 命令行选项来定义,或是由 jar中 Mainfest文件的classpath属性指定,System ClassLoader是Extension ClassLoader的子加载器
  3. 自定义加载器

java.lang.ClassLoader类Api介绍及测试

package lang;

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.stream.Stream;

/**
 * @author jujun chen
 * @date 2020/03/23
 */
public class ClassLoaderTest {

    /**
     * 返回类加载器的名称,如果未指定返回null
     */
    @Test
    public void getName() {
        ClassLoader classLoader = this.getClass().getClassLoader();
        //jdk9后,名字更名
        System.out.println(classLoader.getName()); //app
        System.out.println(classLoader.getParent().getName());//platform
    }


    /**
     * 加载指定全限定名的类,相当于调用 {@link ClassLoader#loadClass(String, boolean) loadClass(name,false)}
     * <p>
     * 不会输出 静态代码块中的内容
     *
     * @throws ClassNotFoundException
     */
    @Test
    public void loadClass() throws ClassNotFoundException {
        ClassLoader classLoader = this.getClass().getClassLoader();
        Class cls = classLoader.loadClass("lang.ChinesePeople");
    }


    /**
     * 返回父类加载器
     * <p>
     * 某些实现可能使用null来表示引导类加载器。 如果此类加载器的父级是引导类加载器,则此方法将在此类实现中返回null
     */
    @Test
    public void getParent() {
        ClassLoader classLoader = this.getClass().getClassLoader();
        ClassLoader parentClassLoader = classLoader.getParent();
        System.out.println(parentClassLoader.getName());
        //返回null,BootStrapClassLoader并不是Java类
        ClassLoader parentClassLoader2 = parentClassLoader.getParent();
//        System.out.println(parentClassLoader2.getName());
    }


    /**
     * 返回此类加载器的未命名模块
     */
    @Test
    public void getUnnamedModule() {
        ClassLoader classLoader = this.getClass().getClassLoader();
        Module module = classLoader.getUnnamedModule();
        System.out.println(module.getName());
    }


    /**
     * 返回系统类加载器。
     * <p>
     * 这是新ClassLoader实例的默认委托父级,通常是用于启动应用程序的类装入器
     */
    @Test
    public void getSystemClassLoader() {
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        //输出app
        System.out.println(systemClassLoader.getName());
    }

    /**
     * 返回平台类加载器
     */
    @Test
    public void getPlatformClassLoader() {
        ClassLoader platformClassLoader = ClassLoader.getPlatformClassLoader();
        System.out.println(platformClassLoader.getName());
    }

    /**
     * 该软件包给定的名字已被这个类加载器定义,如果未找到 返回null
     */
    @Test
    public void getDefinedPackage() {
        ClassLoader classLoader = getClass().getClassLoader();
        Package pk = classLoader.getDefinedPackage("lang");
        System.out.println(pk.getName());
    }

    /**
     * 返回此类加载器定义的所有软件包。返回的数组没有重复的软件包名
     */
    @Test
    public void getDefinedPackages() {
        ClassLoader classLoader = getClass().getClassLoader();
        Package[] packages = classLoader.getDefinedPackages();
    }

    /**
     * 设置此类加载器默认的断言状态
     *
     * <a>https://blog.csdn.net/dominic_z/article/details/104639171</a>
     * <a>http://blog.sina.com.cn/s/blog_ed7fd8610102v0f4.html</a>
     */
    @Test
    public void setDefaultAssertionStatus() {

    }


    /**
     * 设置命名包的包默认断言状态。 包默认断言状态确定将来初始化的类的断言状态,这些类属于命名包或其任何“子包”。
     * 名为p的包的子包是名称以“ p. ”开头的任何包。 例如, javax.swing.text是的一个子包javax.swing ,并且两个java.util和java.lang.reflect是子包java 。
     * <p>
     * 如果多个包默认值适用于给定的类,则与特定包最相关的包默认优先于其他包。 例如,如果javax.lang和javax.lang.reflect都具有与之关联的包默认值,则后一个包默认应用于javax.lang.reflect类。
     * <p>
     * 包默认值优先于类加载器的默认断言状态,并且可以通过调用setClassAssertionStatus(String, boolean)在每个类的基础上重写 。
     * <p>
     * 参数
     * packageName - 要设置其包默认断言状态的包的名称。 null值表示未命名的包为“当前”(请参阅The Java™ Language Specification的第7.4.2节)。
     * enabled - true如果此类加载器加载的类属于命名包或其任何子包,则默认情况下将启用断言, false如果它们默认情况下将禁用断言。
     */
    @Test
    public void setPackageAssertionStatus() {

    }


    /**
     * 为此类加载器中指定的顶级类及其中包含的任何嵌套类设置所需的断言状态。
     * 此设置优先于类加载器的默认断言状态,并优先于任何适用的每个包默认值。
     * 如果已经初始化了命名类,则此方法无效。 (初始化一个类后,其断言状态不会改变。)
     * 如果指定的类不是顶级类,则此调用将不会影响任何类的实际断言状态。
     * <p>
     * 参数
     * className - 要设置其断言状态的顶级类的完全限定类名。
     * enabled - true如果命名类要在初始化时(和如果)初始化时启用断言,则 false如果要禁用断言, false 。
     */
    @Test
    public void setClassAssertionStatus() {

    }


    /**
     * 将此类加载器的默认断言状态设置为false并丢弃与类加载器关联的任何包默认值或类断言状态设置。
     * <p>
     * 提供此方法是为了使类加载器可以忽略任何命令行或持久断言状态设置并“从一个干净的平板开始”
     */
    @Test
    public void clearAssertionStatus() throws ClassNotFoundException {
        ClassLoader classLoader = getClass().getClassLoader();
        classLoader.setDefaultAssertionStatus(true);
        Class cls = classLoader.loadClass("lang.ChinesePeople");
        //实例可以见ClassTest.desiredAssertionStatus Test
        System.out.println(cls.desiredAssertionStatus());
        //重置
        classLoader.clearAssertionStatus();
        System.out.println(cls.desiredAssertionStatus());
    }

    /**
     *查找具有给定名称的资源。资源是可以由类代码以独立于代码位置的方式访问的一些数据(图像、音频、文本等)。
     */
    @Test
    public void getResource() throws IOException {
        //测试Bean
        ChinesePeople chinesePeople = new ChinesePeople();
        System.out.println(chinesePeople.getClass().getResource(""));
        System.out.println(chinesePeople.getClass().getClassLoader().getResource(""));
        /**
         * file:/D:/javaprojects/java11-example/target/test-classes/lang/
         * file:/D:/javaprojects/java11-example/target/test-classes/
         */
        //资源类型为URL的enumeration
        Enumeration<URL> enumeration = chinesePeople.getClass().getClassLoader().getResources("");
        //返回流
        Stream<URL> stream = chinesePeople.getClass().getClassLoader().resources("ChinesePeople.class");
    }

    /**
     * 返回classLoader是否注册为具有并行能力
     *
     */
    @Test
    public void isRegisteredAsParallelCapable(){
        boolean b = this.getClass().getClassLoader().isRegisteredAsParallelCapable();
        System.out.println(b);
    }


    /**
     * 从用于加载类的搜索路径中查找指定名称的资源。此方法通过系统类加载器定位资源(请参阅getSystemClassLoader() )。
     */
    @Test
    public void getSystemResource() {
        URL url = this.getClass().getClassLoader().getSystemResource("");
        System.out.println(url);
        //还可以返回Enumeration<URL>

    }

    /**
     * 返回用于读取指定资源的输入流
     */
    @Test
    public void getResourceAsStream() {
        InputStream getResourceAsStream = this.getClass().getClassLoader().getResourceAsStream("");

        //getSystemResourceAsStream
    }


}

相关文章
|
1月前
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
2天前
|
监控 测试技术 数据库连接
利用 RunnerGo 深度探索 API 性能测试:从理论到实践
API性能测试是保障应用稳定性和用户体验的关键环节。本文详细探讨了如何使用RunnerGo全栈测试平台进行高效API性能测试,涵盖测试计划创建、场景设计、参数配置到执行与分析全过程。通过电商平台促销活动案例,展示了高并发下的测试策略与优化措施,如代码与数据库查询优化、数据库连接池扩容、服务器资源配置调整及缓存策略实施等。最终显著提升系统性能,满足高并发需求。API性能测试需持续关注与优化,以适应业务发展和用户需求变化。
67 33
|
7天前
|
存储 前端开发 数据可视化
Postman vs. Apifox 用于 API 测试全面对比
寻找一款可靠的 API 测试工具?这份对比分析将深入探讨 Postman 和 Apifox 的功能和特性。了解哪款工具最适合您的 API 测试需求。
|
10天前
|
jenkins 测试技术 Shell
利用Apipost轻松实现用户充值系统的API自动化测试
API在现代软件开发中扮演着连接不同系统与模块的关键角色,其测试的重要性日益凸显。传统API测试面临效率低、覆盖率不足及难以融入自动化工作流等问题。Apipost提供了一站式API自动化测试解决方案,支持零代码拖拽编排、全场景覆盖,并可无缝集成CI/CD流程。通过可视化界面,研发与测试人员可基于同一数据源协作,大幅提升效率。同时,Apipost支持动态数据提取、性能压测等功能,满足复杂测试需求。文档还以用户充值系统为例,详细介绍了从创建测试用例到生成报告的全流程,帮助用户快速上手并提升测试质量。
|
4天前
|
监控 安全 测试技术
选择Postman免费版还是付费版,进行 API 测试呢?
深入了解 Postman 免费版和付费版的细节,看看哪一个更适合您的 API 需求。
|
1月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
70 11
|
1月前
|
监控 安全 测试技术
避免15个常见的API测试错误
API测试是现代软件开发中的关键环节,但测试人员常陷入15个常见错误,如忽略文档、遗漏错误响应、缺乏自动化等。这些问题可能导致API的可靠性、安全性及性能下降。本文详细解析这些错误并提供解决建议。Apipost作为全方位工具,支持自动化测试、动态数据处理与安全性验证,助力高效测试,确保API在各种场景下稳定运行。通过避免这些陷阱,团队可显著提升API质量。
|
1月前
|
数据可视化 JavaScript 前端开发
利用Postman和Apipost进行API测试的实践与优化-动态参数
在API测试中,Postman和Apipost是常用的工具。Postman内置变量功能有限,面对复杂场景时需编写JavaScript脚本,增加了维护成本。而Apipost提供丰富的内置变量、可视化动态值配置和低代码操作,支持生成真实随机数据,如邮箱、手机号等,显著提升测试效率和灵活性。对于复杂测试场景,Apipost是更好的选择,能有效降低开发与维护成本,提高测试工作的便捷性和可维护性。
|
2月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
104 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
1月前
|
人工智能 测试技术 API
Windows用户必备:Postman v11详细安装指南与API测试入门教程(附官网下载
Postman是全球领先的API开发与测试工具,支持REST、SOAP、GraphQL等协议调试。2025年最新版v11新增AI智能生成测试用例、多环境变量同步等功能,适用于前后端分离开发、自动化测试、接口文档自动生成及团队协作共享API资源。本文详细介绍Postman的软件定位、核心功能、安装步骤、首次配置、基础使用及常见问题解答,帮助用户快速上手并高效利用该工具进行API开发与测试。
下一篇
oss创建bucket