请看代码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】。
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】。
getClass()是运行程序时动态加载的或者可以说.class是静态的,
getClass()需要具体实例运行时才能获得。所以FileSystemClassLoader. class和new FileSystemClassLoader().getClass()都可以,但是FileSystemClassLoader.class.getClass()是不行的,因为调用getClass的不是具体实例。
String.class 是能对类名的引用取得在内存中该类型class对象的引用,
new String().getClass() 是通过实例对象取得在内存中该实际类型class对象的引用
(这个方法是从java.lang.Object类继承过来的)
getClass()是动态而且是final的
并不是这个原因。FileSystemClassLoader.class 返回的是FileSystemClassLoader这个类的Class对象。FileSystemClassLoader.class.getClass() 返回的是Class这个类的Class对象。
加入第二种写法改成public class FileSystemClassLoader {
public static void main(String[] args) {
System.out.println(
FileSystemClassLoader.
class.
getClass().
getResource("/")
);
}
}
返回的就不是null了,因为 / 会被解析成你项目的根路径,和Class类无关。