• 【转】查看java类是从哪个包加载


    Java的类装载器使用的是优先策略,加载类的时候先找到哪个就加载哪个。有时候我们做一个系统,当类库非常庞大的时候,类可能会出现冲突,也就是类路径中存在不同版本的两个相同的类,这往往给调试带来非常大的麻烦,我们可能修改了类,但由于类加载器却使用的是另外一个未被更新的类,这个时候就会丈二和尚摸不着头脑,一度使调试过程误入歧途。

    那么怎么来确定我当前所加载的类是位于哪个路径或者存在于哪个jar包当中呢?Java语言给我们的解决方案如下代码所示:  

    import java.security.CodeSource;
    import java.security.ProtectionDomain;
    
    import org.apache.commons.lang.StringUtils;
    
    /**
    * 判断类是从哪个jar包中加载的
    * @author Winter Lau
    */
    public class Test {
    
    public static void main(String[] args) {
      ProtectionDomain pd = StringUtils.class.getProtectionDomain();
      CodeSource cs = pd.getCodeSource();
      System.out.println(cs.getLocation());
    }
    }

     

    这段代码在我的机器上运行的结果是:

    file:/D:/PROJECTS/JAVA/DLOG4J_JAVAYOU/webapp/WEB-INF/lib/commons-lang-1.0.1.jar

    这就是StringUtils这个类所在的jar包,一目了然。但是有一个限制经由系统类加载器所加载的类不能使用该方法来获取路径,假如你对 String类做上面的测试就会发生空指针异常,因为所得到的CodeSource为空,你可以在程序启动的时候使用-verbose来查看系统类的装载信息,使用方式有如:

    java -verbose MyApp

  • 相关阅读:
    什么是Azkaban?
    设计模式 应用场景
    初识Nginx
    C++著名程序库的比较和学习经验(STL.Boost.GUI.XML.网络等等)
    C++对象模型笔记之程序设计模型
    深度探索C++对象模型之C++对象模型笔记
    对于数据库设计者而言,在设计表属性类型时应该考虑哪些问题?
    Thread 多线程 同步
    Thread sleep()休眠
    Java 多线程(Thread)学习
  • 原文地址:https://www.cnblogs.com/360buy-gazi/p/5491607.html
Copyright © 2020-2023  润新知