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

在我们日常开发中可能经常会遇到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

结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值