小程序来测试加载的是哪个jar中的类

简介: 在我们日常开发中可能经常会遇到jar冲突的问题,特别是在使用Maven进行项目管理的时候。在这里参考别人的文章写了一个用来测试class是从哪个jar中加载的demo(参考自:http://stamen.iteye.com/blog/2314940)。

在我们日常开发中可能经常会遇到jar冲突的问题,特别是在使用Maven进行项目管理的时候。在这里参考别人的文章写了一个用来测试class是从哪个jar中加载的demo(参考自:http://stamen.iteye.com/blog/2314940)。demo如下:

package com.zkn.spring.miscellaneous.controller;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 用来测试这个Class类是从哪个jar包加载的
 */
@Controller
public class ClassFromWhichJARController {
    private static final String ERR_MESSAGE = "请输入正确的类名!";

    @RequestMapping("/classFromWhichJar")
    @ResponseBody
    public String getClassPath(String className) {

        if (StringUtils.isEmpty(className)) {
            return ERR_MESSAGE;
        }
        try {
            Class<?> clazz = Class.forName(className);
            return getClassFromWhere(clazz);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return ERR_MESSAGE;
    }

    private String getClassFromWhere(Class<?> clazz) {

        if (StringUtils.isEmpty(clazz)) {
            return ERR_MESSAGE;
        }
        String clazzName = clazz.getName().replace('.', '/').concat(".class");

        ProtectionDomain pd = clazz.getProtectionDomain();
        URL url = null;
        if (pd != null) {
            CodeSource codeSource = pd.getCodeSource();
            if (codeSource != null) {
                url = codeSource.getLocation();
            }
            if (url != null) {
                //URL中的协议有很多像:ftp,http,nntp
                if ("file".equals(url.getProtocol())) {
                    try {
                        if (url.toExternalForm().endsWith(".jar") || url.toExternalForm().endsWith(".zip")) {
                            //一般名称都是这样的jar:file:/path/.jar!/.class
                            url = new URL("jar:".concat(url.toExternalForm()).concat("!/").concat(clazzName));
                        } else if (new File(url.getFile()).isDirectory()) {
                            url = new URL(url, clazzName);
                        }
                    } catch (MalformedURLException e) {
                        return ERR_MESSAGE;
                    }
                }
            }
        }
        if (url == null) {
            //像rt.jar中的类是被启动类加载加载的,所以这里就会获取不到类加载器
            ClassLoader classLoader = clazz.getClassLoader();
            url = classLoader != null ? classLoader.getResource(clazzName) : ClassLoader.getSystemResource(clazzName);
        }
        return url.toString();
    }
}
下面我们来测试一下:

发送请求为:http://localhost:8080/classFromWhichJar?className=java.lang.String

结果为:

发送的请求为:http://localhost:8080/classFromWhichJar?className=com.zkn.spring.miscellaneous.controller.ClassFromWhichJARController

结果为:

相关文章
|
机器学习/深度学习 PyTorch 算法框架/工具
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
这篇文章介绍了如何使用PyTorch框架,结合CIFAR-10数据集,通过定义神经网络、损失函数和优化器,进行模型的训练和测试。
991 2
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
|
缓存 小程序 前端开发
商城/点餐/家政类小程序源码合集_微信抖音小程序源码开发从入门到精通实战
本文系统讲解如何利用现有源码快速开发商城、点餐、家政类微信/抖音小程序,涵盖环境搭建、核心功能实现、多平台部署与优化,提供完整技术方案。实战导向,助力开发者高效入门与落地。
|
Java Linux Maven
java依赖冲突解决问题之容器加载依赖jar包如何解决
java依赖冲突解决问题之容器加载依赖jar包如何解决
|
测试技术 开发者
vertx的学习总结6之动态代理类和测试
本文是Vert.x学习系列的第六部分,介绍了如何使用动态代理在事件总线上公开服务,以及如何进行Vert.x组件的异步测试,包括动态代理的创建和使用,以及JUnit 5和Vert.x测试工具的结合使用。
261 3
vertx的学习总结6之动态代理类和测试
|
小程序 前端开发 中间件
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
本文介绍了如何在ThinkPHP框架中配置跨域请求,使用了TP内置的跨域类`\think\middleware\AllowCrossDomain::class`。文章还讨论了小程序和web网页在跨域请求格式上的区别,并提供了解决方案,包括修改跨域中间件源码以支持`Origin`和`token`。此外,还介绍了微信小程序跨域请求的示例和web网页前端发送Axios跨域请求的请求拦截器配置。
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
392 5
|
缓存 小程序 UED
如何利用小程序的生命周期函数实现数据的加载和更新?
如何利用小程序的生命周期函数实现数据的加载和更新?
550 4
|
测试技术 Python
自动化测试项目学习笔记(三):Unittest加载测试用例的四种方法
本文介绍了使用Python的unittest框架来加载测试用例的四种方法,包括通过测试用例类、模块、路径和逐条加载测试用例。
598 0
自动化测试项目学习笔记(三):Unittest加载测试用例的四种方法
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
395 2
|
前端开发 Java 编译器
classpath中存在多个jar存在同限定名的class classloader会如何加载
总之,合理组织类路径和使用现代化的构建工具,可有效避免类加载冲突,保证应用的稳定运行。
762 8