zoukankan      html  css  js  c++  java
  • 判断一个类到底是从哪个jar包中调用的工具类

    项目中使用的jar包较多时,会出现jar冲突的情况,有时候很难判断当前使用的这个类是从哪个jar包中调用的。
    因为一般我们只能看到jar包的名称,不清楚其中的类的目录结构。

    这个类的作用就是说明当前调用的类来自于哪个jar包。

    import java.io.File;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.security.CodeSource;
    import java.security.ProtectionDomain;
    
    public class SystemUtils {
    
        /**
         * 获取一个class类的实际位置
         * @param cls
         * @return
         */
        public static URL getClassLocation(final Class<?> cls) {
    
            //非空判断
            if (cls == null) {
                throw new IllegalArgumentException("null input: cls");
            }
            
            
            URL result = null;
            final String clsAsResource = cls.getName().replace('.', '/').concat(".class");
            
            final ProtectionDomain pd = cls.getProtectionDomain();
            
            if (pd != null) {
                final CodeSource cs = pd.getCodeSource();
                if (cs != null) {
                    result = cs.getLocation();
                }
                    
                if (result != null) {
                    if ("file".equals(result.getProtocol())) {
                        try {
                            if (result.toExternalForm().endsWith(".jar") || result.toExternalForm().endsWith(".zip")) {
                                result = new URL("jar:".concat(result.toExternalForm()).concat("!/").concat(clsAsResource));
                            } else if (new File(result.getFile()).isDirectory()) {
                                result = new URL(result, clsAsResource);
                            }
                        } catch (MalformedURLException ignore) {
                            
                        }
                    }
                }
            }
            
            if (result == null) {
                final ClassLoader clsLoader = cls.getClassLoader();
                result = clsLoader != null ? clsLoader.getResource(clsAsResource) : ClassLoader.getSystemResource(clsAsResource);
            }
            
            return result;
        }
    
    }
  • 相关阅读:
    元类,单例模式
    面向对象高阶
    类的三大特性---封装以及Property特性
    c# 中的string(神奇的string)
    c#中的equal和getHashCode
    linq中的Distinct的使用(附带IComparable和IComparer的复习和使用)
    flex布局完整示例
    flex布局中flex-basis的理解
    CSS两端对齐的效果;
    理解c#中扩展性代码
  • 原文地址:https://www.cnblogs.com/tq03/p/3958315.html
Copyright © 2011-2022 走看看