读书人

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

发布时间: 2012-11-03 10:57:44 作者: rapoo

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

由于项目用到的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/

?

?

?

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/出现在路径里),但还是希望有人能提出更为灵巧的解决方法。

读书人网 >软件架构设计

热点推荐