classLoader对象和Class对象 (类的类型)
每个ClassLoader对象都是一个java.lang.ClassLoader的实例。
每个Class对象都被这些ClassLoader对象所加载,通过继承java.lang.ClassLoader可以扩展出自定义ClassLoader,并使用这些自定义的ClassLoader对类进行加载。
classLoader对象 Class对象
classLoader对象的方法
1、 loadClass(String name)方法 最重要的是ClassLoader的loadClass方法,它接受一个全类名,然后返回一个Class类型的实例(返回class对象)
Class对象 的方法
Class a=A.class
classLoader b= a.getClassLoader()
A.class.getClassLoader() //获得A类的类加载器对象
ClassLoader的作用
我们都知道java程序写好以后是以.java(文本文件)的文件存在磁盘上,然后,我们通过(bin/javac.exe)编译命令把.java文件编译成.class文件(字节码文件),并存在磁盘上。但是程序要运行,首先一定要把.class文件加载到JVM内存中才能使用的,我们所讲的classLoader,就是负责把磁盘上的.class文件加载到JVM内存中。
https://tech.souyunku.com/wang-meng/p/5574071.html
你可以认为每一个Class对象拥有磁盘上的那个.class字节码内容,每一个class对象都有一个getClassLoader()方法,得到是谁把我从.class文件加载到内存中变成Class对象的。
this.class.getClassLoader()解析
this.class
java是面向对象语言,面向对象的语言的宗旨就是万事万物皆对象,那么类、类里面的属性和方法都是对象。java里面的所有的类都是Class类的对象,this.class是获得这个类相对于Class类的对象。
类型对象
getClassLoader()是获得这个类对象的加载器。
只有Class类才有getClassLoader()方法;java设计Class这个类,用于虚拟机对类的管理。当一个类被虚拟机装载完毕的时候,就会创建一个Class类的实例,对于类A就是A.class,对于类B就是B.class。
Class类也提供了许多方法来获取类的信息。
要知道,类的装载器分为 “启动类装载器 “、”用户定义装载器 “。它不止一种,Class类需要保存这些信息,getClassLoader()是用来获取这个信息的;
因为.class.getClassLoader()是为了获得一个类加载器,用来加载classpath下的.class文件而已。
关于this.class.getResource和ClassLoader.getResource的路径问题
https://tech.souyunku.com/yejg1212/p/3270152.html
类类型对象
Class.getResource(String path)
path不以’/'开头时,默认是从此类所在的包下取资源;
path 以’/'开头时,则是从ClassPath根下获取;
/代表根,这和linux是一致的
package testpackage;
public class TestMain {
public static void main(String[] args) {
System.out.println(TestMain.class.getResource(""));
System.out.println(TestMain.class.getResource("/"));
}
}
输出结果:
file:/E:/workspace/Test/bin/testpackage/
file:/E:/workspace/Test/bin/
上面说到的【path以’/’开头时,则是从ClassPath根下获取;】在这里就是相当于bin目录
如果我们想在TestMain.java中分别取到1~3.properties文件,该怎么写路径呢?代码如下:
package testpackage;
public class TestMain {
public static void main(String[] args) {
// 当前类(class)所在的包目录
System.out.println(TestMain.class.getResource(""));
// class path根目录
System.out.println(TestMain.class.getResource("/"));
// TestMain.class在<bin>/testpackage包中
// 2.properties 在<bin>/testpackage包中
System.out.println(TestMain.class.getResource("2.properties"));
// TestMain.class在<bin>/testpackage包中
// 3.properties 在<bin>/testpackage.subpackage包中
System.out.println(TestMain.class.getResource("subpackage/3.properties"));
// TestMain.class在<bin>/testpackage包中
// 1.properties 在bin目录(class根目录)
System.out.println(TestMain.class.getResource("/1.properties"));
}
}
类加载器对象
Class.getClassLoader().getResource(String path)
path不能以’/'开头时;
path是从ClassPath根下获取;bin目录下
package testpackage;
public class TestMain {
public static void main(String[] args) {
TestMain t = new TestMain();
System.out.println(t.getClass()); //类类型对象
System.out.println(t.getClass().getClassLoader());//类加载器对象
System.out.println(t.getClass().getClassLoader().getResource(""));
System.out.println(t.getClass().getClassLoader().getResource("/"));//null
}
}
class testpackage.TestMain
sun.misc.Launcher$AppClassLoader@1fb8ee3
file:/E:/workspace/Test/bin/
null
从结果来看【TestMain.class.getResource(“/”) == t.getClass().getClassLoader().getResource(“”)】