玩轉(zhuǎn)Java的CLASSPATH(三)JWhich的工作過程(轉(zhuǎn))
四、JWhich的工作過程
要精確地測(cè)定classpath中哪一個(gè)類先被裝載,你必須深入到類裝載器的思考方法。事實(shí)上,具體實(shí)現(xiàn)的時(shí)候并沒有聽起來這么復(fù)雜??你只需直接詢問類裝載器就可以了!
1: public class JWhich {
2:
3: /**
4: * 根據(jù)當(dāng)前的classpath設(shè)置,
5:
* 顯示出包含指定類的類文件所在
6: * 位置的絕對(duì)路徑
7: *
8: * @param className
<類的名字>
9: */
10: public static void which(String className)
{
11:
12: if (!className.startsWith("/")) {
13: className = "/" +
className;
14: }
15: className = className.replace(´.´, ´/´);
16:
className = className + ".class";
17:
18: java.net.URL classUrl =
19:
new JWhich().getClass().getResource(className);
20:
21: if (classUrl !=
null) {
22: System.out.println(" Class ´" + className +
23: "´ found in ´"
+ classUrl.getFile() + "´");
24: } else {
25: System.out.println(" Class
´" + className +
26: "´ not found in ´" +
27:
System.getProperty("java.class.path") + "´");
28: }
29: }
30:
31:
public static void main(String args[]) {
32: if (args.length > 0) {
33:
JWhich.which(args[0]);
34: } else {
35: System.err.println("Usage: java
JWhich ");
36: }
37: }
38:
}
首先,你必須稍微調(diào)整一下類的名字以便類裝載器能夠接受(12-16行)。在類的名字前面加上一個(gè)“/”表示要求類裝載器對(duì)classpath中的類名字進(jìn)行逐字精確匹配,而不是嘗試隱含地加上調(diào)用類的包名字前綴。把所有“.”轉(zhuǎn)換為“/”的目的是,按照類裝載器的要求,把類名字格式化成一個(gè)合法的URL資源名。
接下來,程序向類裝載器查詢資源,這個(gè)資源的名字必須和經(jīng)過適當(dāng)格式化的類名字匹配(18-19行)。每一個(gè)Class對(duì)象維護(hù)著一個(gè)對(duì)裝載它的ClassLoader對(duì)象的引用,所以這里是向裝載JWhich類的類裝載器查詢。Class.getResource()方法實(shí)際上委托裝入該類的類裝載器,返回一個(gè)用于讀取類文件資源的URL;或者,當(dāng)指定的類名字不能在當(dāng)前的classpath中找到時(shí),Class.getResource()方法返回null [@more@]