日期:2014-05-20  浏览次数:20658 次

java的getClass()的问题
请看代码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的
------解决方案--------------------
引用:
.class其实是在java运行时就加载进去的
getClass()是运行程序时动态加载的

或者可以说.class是静态的,
getClass()需要具体实例运行时才能获得。

所以FileSystemClassLoader. class和new FileSystemClassLoader().getClass()都可以,但是FileSystemClassLoader.class.getClass()是不行的,因为调用getClass的不是具体实例。


并不是这个原因。

FileSystemClassLoader.class 返回的是FileSystemClassLoader这个类的Class对象。

FileSystemClassLoader.class.getClass() 返回的是Class这个类的Class对象。