请看代码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】。

解决方案 »

  1.   

    .class其实是在java运行时就加载进去的
    getClass()是运行程序时动态加载的或者可以说.class是静态的,
    getClass()需要具体实例运行时才能获得。所以FileSystemClassLoader. class和new FileSystemClassLoader().getClass()都可以,但是FileSystemClassLoader.class.getClass()是不行的,因为调用getClass的不是具体实例。
      

  2.   

    class叫做“类字面量”,因class是关键字, 所以class编译时确定,getclass()运行时根据实际实例确定。
    String.class 是能对类名的引用取得在内存中该类型class对象的引用, 
    new String().getClass() 是通过实例对象取得在内存中该实际类型class对象的引用 
    (这个方法是从java.lang.Object类继承过来的)
    getClass()是动态而且是final的
      

  3.   


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

  4.   

    真正的原因是因为Class这个类的Class文件并不在你项目里面,而是在JDK里面,../ 这个字符串会被解析成 java/lang/../ ,而这个类路径在你的项目里面是不存在的,所以返回的是空。也就是说,第二种写法,你在你的项目类路径里面去找了JDK的类路径,结果当然是找不到。
    加入第二种写法改成public class FileSystemClassLoader {
        public static void main(String[] args) {
            System.out.println(
                    FileSystemClassLoader.
                    class.
                    getClass().
                    getResource("/")
            );
        }
    }
    返回的就不是null了,因为 / 会被解析成你项目的根路径,和Class类无关。