您知道你的类是从哪个文件中装载的吗
你知道你的类是从哪个文件中装载的吗?
以上代码返回的结果有可能为
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/出现在路径里),但还是希望有人能提出更为灵巧的解决方法。
由于项目用到的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/
1 楼
unsid
2009-01-10
我遇到这样的问题了,感觉同样是classpathload的两个同名同目录类,那个jar包牌在操作系统文件列表的前面,先装载哪个类
2 楼
javatracker
2009-01-11
要想能清楚类加载的是哪个包中的类要弄清楚两个方面:
1、类加载器的原理;
2、容器或框架的加载机制;
一般业务代码都是AppClassLoader或其子类加载的,如果同一个类两次加载的加载器在同一个分支通路上,那么就只有最上面加载的那个类,不存在加载两个类的情况。如果处于不同的分支,不同的加载器就得到不同的两个类
1、类加载器的原理;
2、容器或框架的加载机制;
一般业务代码都是AppClassLoader或其子类加载的,如果同一个类两次加载的加载器在同一个分支通路上,那么就只有最上面加载的那个类,不存在加载两个类的情况。如果处于不同的分支,不同的加载器就得到不同的两个类
3 楼
donghp1979
2009-01-11
在使用OSGi时估计会遇到无法确定加载哪个包的类的情况的,这是后打印一下也有好处。
4 楼
SysTem128
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/出现在路径里),但还是希望有人能提出更为灵巧的解决方法。