请看代码1:
public class FileSystemClassLoader {
public static void main(String[] args) {
System.out.println(
FileSystemClassLoader.
class.
getResource("../")
);
}
}
这是一个正确的程序,输出的是:file:/D:/Application/Use_file/Java_Use/Java_Eclipse/Test/bin/
现在修改一步:
请看代码2:
public class FileSystemClassLoader {
public static void main(String[] args) {
System.out.println(
FileSystemClassLoader.
class.
getClass().
getResource("../")
);
}
}
结果为 : null
现在我想问问,“ .class ”和getClass()不是一回事么?都是这个类的相关Class信息啊?,为什么只是多了个getClass()就找不到资源了?【找不到资源返回null】。
------解决方案--------------------
.class其实是在java运行时就加载进去的
getClass()是运行程序时动态加载的
或者可以说.class是静态的,
getClass()需要具体实例运行时才能获得。
所以FileSystemClassLoader. class和new FileSystemClassLoader().getClass()都可以,但是FileSystemClassLoader.class.getClass()是不行的,因为调用getClass的不是具体实例。
------解决方案--------------------
class叫做“类字面量”,因class是关键字, 所以class编译时确定,getclass()运行时根据实际实例确定。
String.class 是能对类名的引用取得在内存中该类型class对象的引用,
new String().getClass() 是通过实例对象取得在内存中该实际类型class对象的引用
(这个方法是从java.lang.Object类继承过来的)
getClass()是动态而且是final的
------解决方案--------------------
并不是这个原因。
FileSystemClassLoader.class 返回的是FileSystemClassLoader这个类的Class对象。
FileSystemClassLoader.class.getClass() 返回的是Class这个类的Class对象。