【读码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
    }


}

相关文章
|
5月前
|
人工智能 数据可视化 测试技术
Postman 性能测试教程:快速上手 API 压测
本文介绍API上线后因高频调用导致服务器告警,通过Postman与Apifox进行压力测试排查性能瓶颈。对比两款工具在批量请求、断言验证、可视化报告等方面的优劣,探讨API性能优化策略及行业未来发展方向。
Postman 性能测试教程:快速上手 API 压测
|
7月前
|
人工智能 监控 安全
API安全测试工具:数字经济的免疫防线
API安全面临漏洞盲区、配置错误与合规碎片三大挑战,传统手段难抵新型风险。破局需构建智能漏洞探针、配置审计中枢与合规映射引擎三位一体防御矩阵。Burp Suite、Noname Security、Traceable AI与板栗看板等工具助力企业实现自动化检测、精准响应与高效合规,打造API安全免疫体系。
|
6月前
|
XML 安全 测试技术
【干货满满】分享什么是API接口测试
API接口测试是验证应用程序编程接口功能、性能、安全性及兼容性的关键环节,通过模拟请求并验证响应结果,确保接口能正确处理各种输入和场景。测试内容涵盖功能验证、性能评估、安全防护、兼容性验证及系统可靠性。相比UI测试,API测试无需界面依赖,支持数据驱动与自动化,适用于持续集成流程。常见接口类型包括RESTful、SOAP和GraphQL API,广泛应用于电商、金融及社交平台,保障系统间数据交互的安全与高效。
|
7月前
|
JSON JavaScript 测试技术
用Postman玩转电商API:一键测试+自动化请求教程
Postman 是电商 API 测试的高效工具,涵盖基础配置、自动化测试、环境管理与请求自动化,助你快速提升开发效率。
|
5月前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
722 11
|
11月前
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
6月前
|
API 开发工具 开发者
客流类API实测:门店到访客群画像数据
本文介绍了一个实用的API——“门店到访客群画像分布”,适用于线下实体门店进行客群画像分析。该API支持多种画像维度,如性别、年龄、职业、消费偏好等,帮助商家深入了解顾客特征,提升运营效率。文章详细说明了API的参数配置、响应数据、接入流程,并附有Python调用示例,便于开发者快速集成。适合零售、餐饮等行业从业者使用。
客流类API实测:门店到访客群画像数据
|
10月前
|
监控 测试技术 数据库连接
RunnerGo API 性能测试实战:从问题到解决的全链路剖析
API性能测试是保障软件系统稳定性与用户体验的关键环节。本文详细探讨了使用RunnerGo全栈测试平台进行API性能测试的全流程,涵盖测试计划创建、场景设计、执行分析及优化改进。通过电商平台促销活动的实际案例,展示了如何设置测试目标、选择压测模式并分析结果。针对发现的性能瓶颈,提出了代码优化、数据库调优、服务器资源配置和缓存策略等解决方案。最终,系统性能显著提升,满足高并发需求。持续关注与优化API性能,对系统稳定运行至关重要。
|
6月前
|
监控 安全 测试技术
API测试工具评测:Apipost与Apifox的优劣深度解读
本文对比了Apipost与Apifox在API设计、数据建模、代码生成、测试能力、协作权限、性能监控、插件生态、文档管理及安全合规等方面的差异。Apifox在专业性、自动化、扩展性及团队协作上表现更优,尤其适合中大型项目与复杂管理需求,而Apipost功能较基础,适用于轻量级使用场景。
|
6月前
|
JSON 安全 测试技术
什么是API接口测试?这可能是全网最全的教程了!
API 是应用程序间的“中间人”,用于实现通信和数据交换。随着微服务架构的普及,API 数量激增,其质量对系统稳定性至关重要。API 测试可验证功能、性能与安全性,帮助开发者在部署前发现并修复问题,提升系统可靠性。测试内容包括请求方法、URL、请求头、请求体、响应状态码与响应数据等。常用工具如 Postman、AREX 可辅助测试,确保 API 在不同场景下的正确性与稳定性。