论坛首页 Java企业应用论坛

你知道你的类是从哪个文件中装载的吗?

浏览 2577 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-10  

由于项目用到的Jar包或者Classpath内容较多,经常出现同时装载两份Class的情况,今天恰好在浏览时看到如下代码:

public class Whoami {

 /**
  * @param args
  * @throws Exception
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  which(Whoami.class);
 }

 public static void which(Class aClass) throws Exception {
  System.out.println(aClass.getProtectionDomain().getCodeSource().getLocation());
 }

}

输出如下:

file:/D:/Applications/Workspaces/JBossTools/registration/build/classes/

检查你用的类到底是从哪个Jar包或者目录下装载的,这样以后类似问题也多了一个诊断的手段!哈哈哈

如果你怀疑你用的类的版本,那么请用这个方法吧!

参考文章:

http://www.0xcafefeed.com/2008/05/where-was-this-class-loaded-from/

 

 

 

   发表时间:2009-01-10  
我遇到这样的问题了,感觉同样是classpathload的两个同名同目录类,那个jar包牌在操作系统文件列表的前面,先装载哪个类
0 请登录后投票
   发表时间:2009-01-11  
要想能清楚类加载的是哪个包中的类要弄清楚两个方面:
1、类加载器的原理;
2、容器或框架的加载机制;
一般业务代码都是AppClassLoader或其子类加载的,如果同一个类两次加载的加载器在同一个分支通路上,那么就只有最上面加载的那个类,不存在加载两个类的情况。如果处于不同的分支,不同的加载器就得到不同的两个类
0 请登录后投票
   发表时间:2009-01-11  
在使用OSGi时估计会遇到无法确定加载哪个包的类的情况的,这是后打印一下也有好处。
0 请登录后投票
   发表时间:2009-01-11  
this.getClass().getResource(".");
// 或
this.getClass().getResource("/");


以上代码返回的结果有可能为
classes/
classes/package/Class.class
如果在Web容器下有可能返回 /usr/local/tomcat/bin   /usr/local/resin/bin (实际程序部署位置可能是 /webroot/app/),更有甚者会返回  / 或 c:/ (glassfish里好像)。

有时候,尤其是在部署Web应用且不能拿到ServletContext的时候。需要有其它方式获取WEB-INF文件夹的位置。

我们期望的是一种统一的结果 比如 getResource(".")即返回当前class文件路径,getResource("/")即返回 classes/ 路径。可惜在实践过程中并非如此,虽然有比较权宜的解决方式了(判断半天看看有没有classes/出现在路径里),但还是希望有人能提出更为灵巧的解决方法。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics