TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
如果你的CLASSPATH中有十数个目录,还有数十个.jar,在你引用一个class时,如何知道我所使用的这个class来自哪个目录或者来自哪个.jar呢?尤其在可能有多个版本位于多个目录或者.jar中的时候。不幸的是,很多人每天都在面对着这样的境况。 我曾经遇到过一个活生生的例子。曾经有同事在测试程序时总是报一个JDOM的一个类没有找到。但我们无数次地确认了jdom包就在它的lib目录下。并且在这个jdom.jar包中也找到了这个class。甚至重装了Windows,仍然是这样。而在其它人的环境中就没有问题。 最后终于发现原来在他的jre的lib/ext目录中不知道什么时候放入了一个jdom的老版本的jar。有意思的是即是重新安装了windows,这个ext其实还是在的。所以,重装有的时候并不是万能药。
扯远了。下面看如何得到一个class的地址。代码如下: import java.net.URL; public class CpLookup
{
public static void main(String[] args)
{
if (args.length < 1)
{
System.out.println("Usage: java CpLookup [class name]");
System.exit(0);
}; CpLookup.lookup(args[0]);
} public static void lookup (String clzName) {
if (! clzName.startsWith("/")) clzName = "/" + clzName;
clzName = clzName.replace(".", "/");
if (!clzName.endsWith(".class")) clzName += ".class"; System.out.println("CLASSPATH: " + System.getProperty("java.class.path")); URL loc = CpLookup.class.getResource (clzName);
if (loc != null)
{
System.out.println(clzName + ": " + loc);
} else {
System.out.println(clzName + " not found.");
}
}
} 我们来运行一下看看: C:mysrc>java CpLookup java.lang.Object
CLASSPATH: .
/java/lang/Object.class: jar:file:/C:/Program%20Files/Java/j2re1.4.2_11/lib/rt.j
ar!/java/lang/Object.class 其实有效代码就一行:URL loc = CpLookup.class.getResource (clzName); 这在调试时也很有用。如果怀疑某个类的版本比较妖怪,可以使用CpLookup.lookup()一下,看看是不是在一个你根本想不到的地方存在了一个另类版本。也许可以在关键时候避免你熬个通宵。
源码下载:http://file.javaxxz.com/2014/10/1/160252516.zip |
|